Sophie

Sophie

distrib > Mandriva > 9.1 > ppc > by-pkgid > e0521f28751d07a87e3a3d6c7d15a1ac > files > 1949

libgtkmm2.0_1-devel-2.2.1-2mdk.ppc.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Example Documentation</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head>
<body bgcolor="#ffffff">
<table border="0" width="100%">
<tr>
    <td width="10%" height="40"><img src="../../images/gtkmm_logo.gif" alt="logo" border="0" width="100%" height="100%"/></td>
    <td width="90%" height="40"><img src="../../images/top.gif" alt="top" width="100%" height="40"/></td>
</tr>
</table>
<center>
  <a class="qindex" href="../../index.html">Main Page</a> &nbsp;
  <a href="group__Widgets.html">Widgets</a> &nbsp;
  <a class="qindex" href="namespaces.html"> Namespaces</a> &nbsp;
  <a href="../../tutorial/html/index.html"> Book</a> &nbsp;
</center>
<hr width="100%"/>

<!-- Generated by Doxygen 1.3-rc1 -->
<h1>thread/thread.cc</h1>A glibmm thread example.
<p>
<div class="fragment"><pre>
<span class="preprocessor">#include &lt;iostream&gt;</span>
<span class="preprocessor">#include &lt;queue&gt;</span>
<span class="preprocessor">#include &lt;sigc++/class_slot.h&gt;</span>
<span class="preprocessor">#include &lt;<a class="code" href="random_8h.html">glibmm/random.h</a>&gt;</span>
<span class="preprocessor">#include &lt;<a class="code" href="thread_8h.html">glibmm/thread.h</a>&gt;</span>
<span class="preprocessor">#include &lt;<a class="code" href="timer_8h.html">glibmm/timer.h</a>&gt;</span>


<span class="keyword">namespace</span>
<span class="keyword"></span>{

<span class="keyword">class </span>MessageQueue
{
<span class="keyword">public</span>:
  MessageQueue();
  ~MessageQueue();

  <span class="keywordtype">void</span> producer();
  <span class="keywordtype">void</span> consumer();

<span class="keyword">private</span>:
  <a name="_a17"></a><a class="code" href="classGlib_1_1Mutex.html">Glib::Mutex</a>     mutex_;
  <a name="_a18"></a><a class="code" href="classGlib_1_1Cond.html">Glib::Cond</a>      cond_push_;
  <a class="code" href="classGlib_1_1Cond.html">Glib::Cond</a>      cond_pop_;
  std::queue&lt;int&gt; queue_;
};


MessageQueue::MessageQueue()
{}

MessageQueue::~MessageQueue()
{}

<span class="keywordtype">void</span> MessageQueue::producer()
{
  <a name="_a19"></a><a class="code" href="classGlib_1_1Rand.html">Glib::Rand</a> rand (1234);

  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; 200; ++i)
  {
    {
      <a name="_a20"></a><a class="code" href="classGlib_1_1Mutex_1_1Lock.html">Glib::Mutex::Lock</a> lock (mutex_);

      <span class="keywordflow">while</span>(queue_.size() &gt;= 64)
        cond_pop_.wait(mutex_);

      queue_.push(i);
      std::cout &lt;&lt; <span class="charliteral">'*'</span>;
      std::cout.flush();

      cond_push_.signal();
    }

    <span class="keywordflow">if</span>(rand.<a name="a21"></a><a class="code" href="classGlib_1_1Rand.html#a4">get_bool</a>())
      <span class="keywordflow">continue</span>;

    <a name="a22"></a><a class="code" href="namespaceGlib.html#a230">Glib::usleep</a>(rand.<a name="a23"></a><a class="code" href="classGlib_1_1Rand.html#a6">get_int_range</a>(0, 100000));
  }
}

<span class="keywordtype">void</span> MessageQueue::consumer()
{
  <a class="code" href="classGlib_1_1Rand.html">Glib::Rand</a> rand (4567);

  <span class="keywordflow">for</span>(;;)
  {
    {
      <a class="code" href="classGlib_1_1Mutex_1_1Lock.html">Glib::Mutex::Lock</a> lock (mutex_);

      <span class="keywordflow">while</span>(queue_.empty())
        cond_push_.wait(mutex_);

      <span class="keyword">const</span> <span class="keywordtype">int</span> i = queue_.front();
      queue_.pop();
      std::cout &lt;&lt; <span class="stringliteral">"\x08 \x08"</span>;
      std::cout.flush();

      cond_pop_.signal();

      <span class="keywordflow">if</span>(i &gt;= 199)
        <span class="keywordflow">break</span>;
    }

    <span class="keywordflow">if</span>(rand.<a class="code" href="classGlib_1_1Rand.html#a4">get_bool</a>())
      <span class="keywordflow">continue</span>;

    <a class="code" href="namespaceGlib.html#a230">Glib::usleep</a>(rand.<a class="code" href="classGlib_1_1Rand.html#a6">get_int_range</a>(10000, 200000));
  }
}

}


<span class="keywordtype">int</span> main(<span class="keywordtype">int</span>, <span class="keywordtype">char</span>**)
{
  <a name="a24"></a><a class="code" href="group__Threads.html#a0">Glib::thread_init</a>();

  MessageQueue queue;

  <a name="_a25"></a><a class="code" href="classGlib_1_1Thread.html">Glib::Thread</a> *<span class="keyword">const</span> producer = <a name="a26"></a><a class="code" href="classGlib_1_1Thread.html#d0">Glib::Thread::create</a>(
      SigC::slot_class(queue, &amp;MessageQueue::producer), <span class="keyword">true</span>);

  <a class="code" href="classGlib_1_1Thread.html">Glib::Thread</a> *<span class="keyword">const</span> consumer = <a class="code" href="classGlib_1_1Thread.html#d0">Glib::Thread::create</a>(
      SigC::slot_class(queue, &amp;MessageQueue::consumer), <span class="keyword">true</span>);

  producer-&gt;<a name="a27"></a><a class="code" href="classGlib_1_1Thread.html#a1">join</a>();
  consumer-&gt;<a class="code" href="classGlib_1_1Thread.html#a1">join</a>();

  std::cout &lt;&lt; std::endl;

  <span class="keywordflow">return</span> 0;
}

</pre></div><hr><address><small>
Generated for gtkmm by <a href="http://www.doxygen.org/index.html">
Doxygen</a> 1.3-rc1 &copy;&nbsp;1997-2001</small></address>
</body>
</html>