summaryrefslogtreecommitdiff
path: root/docs/tutorials/012/page04.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/tutorials/012/page04.html')
-rw-r--r--docs/tutorials/012/page04.html124
1 files changed, 124 insertions, 0 deletions
diff --git a/docs/tutorials/012/page04.html b/docs/tutorials/012/page04.html
new file mode 100644
index 00000000000..34e51c643ee
--- /dev/null
+++ b/docs/tutorials/012/page04.html
@@ -0,0 +1,124 @@
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+ <META NAME="Author" CONTENT="James CE Johnson">
+ <TITLE>ACE Tutorial 012</TITLE>
+</HEAD>
+<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F">
+
+<CENTER><B><FONT SIZE=+2>ACE Tutorial 012</FONT></B></CENTER>
+
+<CENTER><B><FONT SIZE=+2>Passing classes through ACE_Message_Queue</FONT></B></CENTER>
+
+
+<P>
+<HR WIDTH="100%">
+<P>
+Ok, finally we get to main(). Sorry for the diversion but it was
+important to lay some of that groundwork before getting here.
+<P>
+<HR WIDTH="100%">
+<PRE>
+/*
+ I want to be sure that our Task object gets destructed correctly, so
+ I'll do most of the application 'work' in run_test() instead of
+ main()
+*/
+int run_test (int iterations, int threads)
+{
+ /*
+ Create the Task which is our thread pool for doing work
+ */
+ Task task;
+
+ if (task.open (threads) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "open"), -1);
+ }
+
+ /*
+ Give the Task a chance to enter it's svc() method. This isn't
+ really necessary and you probably wouldn't do it in a real
+ application but it makes the output more interesting.
+ */
+ ACE_OS::sleep (ACE_Time_Value (1));
+
+ for (int i = 0; i < iterations; ++i)
+ {
+ /*
+ Construct a Work object that we'll put into the Queue. Give it
+ the iteration number so that it can identify itself in the output.
+ */
+ Work * data = new Work(i);
+
+ /*
+ Create a block that contains our Work object but also has
+ enough room for a text message.
+ */
+ Message_Block *message = new Message_Block (128, data);
+
+ /*
+ As before, put a text message into the block.
+ */
+ ACE_OS::sprintf (message->wr_ptr (), "This is message %d.", i);
+ message->wr_ptr (strlen (message->rd_ptr ())+1);
+
+ /*
+ Add the work to our thread pool
+ */
+ if (task.putq (message) == -1)
+ {
+ break;
+ }
+ }
+
+ /*
+ Insert a HANGUP message block to tell the thread pool to shut
+ itself down.
+ */
+ Message_Block *message = new Message_Block (0,0);
+ message->msg_type (ACE_Message_Block::MB_HANGUP);
+ task.putq (message);
+
+ /*
+ Wait for the all threads of the Task to exit. It is rather rude
+ to let the Task go out of scope without doing this first.
+ */
+ task.wait ();
+
+ return (0);
+}
+
+int main (int argc, char *argv[])
+{
+ /*
+ Give the user a chance to override the default number of
+ iterations and pool threads.
+ */
+ int iterations = argc > 1 ? atoi (argv[1]) : 4;
+ int threads = argc > 2 ? atoi (argv[2]) : 2;
+
+ /*
+ Use the function above to do the actual test. As I said, this
+ lets us see the Task go out of scope and destruct before our
+ "exiting" message below.
+ */
+ (void) run_test (iterations, threads);
+
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) Application exiting\n"));
+
+ exit (0);
+}
+</PRE>
+<HR WIDTH="100%">
+<P>
+That certainly looks cleaner than the previous approach! If you
+blink, you'll miss the part where the Work object goes into the Queue.
+<P>
+<HR WIDTH="100%">
+<P>
+<CENTER>[<A HREF="..">Tutorial Index</A>] [<A HREF="page05.html">Continue
+This Tutorial</A>]</CENTER>
+
+</BODY>
+</HTML>