Sophie

Sophie

distrib > Mageia > 5 > i586 > media > core-release > by-pkgid > 7aa0b3689999b2d0524276a8f3c2a10a > files > 1202

glibmm2.4-doc-2.42.0-3.mga5.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.7"/>
<title>glibmm: thread/dispatcher.cc</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">glibmm
   &#160;<span id="projectnumber">2.42.0</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.7 -->
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li><a href="examples.html"><span>Examples</span></a></li>
    </ul>
  </div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">thread/dispatcher.cc</div>  </div>
</div><!--header-->
<div class="contents">
<p>A <a class="el" href="classGlib_1_1Dispatcher.html" title="Signal class for inter-thread communication. ">Glib::Dispatcher</a> example.</p>
<div class="fragment"><div class="line"><span class="comment">/*</span></div>
<div class="line"><span class="comment"> * Glib::Dispatcher example -- cross thread signalling</span></div>
<div class="line"><span class="comment"> * by Daniel Elstner  &lt;daniel.kitta@gmail.com&gt;</span></div>
<div class="line"><span class="comment"> *</span></div>
<div class="line"><span class="comment"> * modified to only use glibmm</span></div>
<div class="line"><span class="comment"> * by J. Abelardo Gutierrez &lt;jabelardo@cantv.net&gt;</span></div>
<div class="line"><span class="comment"> *</span></div>
<div class="line"><span class="comment"> * Copyright (c) 2002-2003  Free Software Foundation</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line"></div>
<div class="line"><span class="preprocessor">#include &lt;glibmm.h&gt;</span></div>
<div class="line"></div>
<div class="line"><span class="preprocessor">#include &lt;<a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00972.html">algorithm</a>&gt;</span></div>
<div class="line"><span class="preprocessor">#include &lt;<a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01204.html">functional</a>&gt;</span></div>
<div class="line"><span class="preprocessor">#include &lt;<a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01265.html">iostream</a>&gt;</span></div>
<div class="line"><span class="preprocessor">#include &lt;<a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01590.html">vector</a>&gt;</span></div>
<div class="line"></div>
<div class="line"><span class="keyword">namespace</span></div>
<div class="line">{</div>
<div class="line"></div>
<div class="line"><span class="comment">/*</span></div>
<div class="line"><span class="comment"> * Note that it does not make sense for this class to inherit from</span></div>
<div class="line"><span class="comment"> * sigc::trackable, as doing so would only give a false sense of security.</span></div>
<div class="line"><span class="comment"> * Once the thread launch has been triggered, the object has to stay alive</span></div>
<div class="line"><span class="comment"> * until the thread has been joined again.  The code running in the thread</span></div>
<div class="line"><span class="comment"> * assumes the existence of the object.  If it is destroyed earlier, the</span></div>
<div class="line"><span class="comment"> * program will crash, with sigc::trackable or without it.</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line"><span class="keyword">class </span>ThreadProgress</div>
<div class="line">{</div>
<div class="line"><span class="keyword">public</span>:</div>
<div class="line">  <span class="keyword">explicit</span> ThreadProgress(<span class="keywordtype">int</span> <span class="keywordtype">id</span>);</div>
<div class="line">  <span class="keyword">virtual</span> ~ThreadProgress();</div>
<div class="line"></div>
<div class="line">  <span class="keywordtype">int</span>  id() <span class="keyword">const</span>;</div>
<div class="line">  <span class="keywordtype">void</span> <a name="a0"></a><a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01646.html#ga6f4ad125d364f01560e2ed20a3c8bb5b">launch</a>();</div>
<div class="line">  <span class="keywordtype">void</span> join();</div>
<div class="line">  <span class="keywordtype">bool</span> unfinished() <span class="keyword">const</span>;</div>
<div class="line"></div>
<div class="line">  <a name="_a1"></a><a class="codeRef" href="http://library.gnome.org/devel/libsigc++/unstable/classsigc_1_1signal.html">sigc::signal&lt;void&gt;</a>&amp; signal_finished();</div>
<div class="line"></div>
<div class="line"><span class="keyword">private</span>:</div>
<div class="line">  <span class="keyword">enum</span> { ITERATIONS = 100 };</div>
<div class="line"></div>
<div class="line">  <span class="comment">// Note that the thread does not write to the member data at all.  It only</span></div>
<div class="line">  <span class="comment">// reads signal_increment_, which is only written to before the thread is</span></div>
<div class="line">  <span class="comment">// launched.  Therefore, no locking is required.</span></div>
<div class="line">  <a name="_a2"></a><a class="code" href="classGlib_1_1Threads_1_1Thread.html">Glib::Threads::Thread</a>*       thread_;</div>
<div class="line">  <span class="keywordtype">int</span>                 id_;</div>
<div class="line">  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>        progress_;</div>
<div class="line">  <a name="_a3"></a><a class="code" href="classGlib_1_1Dispatcher.html">Glib::Dispatcher</a>    signal_increment_;</div>
<div class="line">  <a class="codeRef" href="http://library.gnome.org/devel/libsigc++/unstable/classsigc_1_1signal.html">sigc::signal&lt;void&gt;</a>  signal_finished_;</div>
<div class="line"></div>
<div class="line">  <span class="keywordtype">void</span> progress_increment();</div>
<div class="line">  <span class="keywordtype">void</span> thread_function();</div>
<div class="line">};</div>
<div class="line"></div>
<div class="line"><span class="keyword">class </span>Application : <span class="keyword">public</span> <a name="_a4"></a><a class="codeRef" href="http://library.gnome.org/devel/libsigc++/unstable/structsigc_1_1trackable.html">sigc::trackable</a></div>
<div class="line">{</div>
<div class="line"><span class="keyword">public</span>:</div>
<div class="line">  Application();</div>
<div class="line">  <span class="keyword">virtual</span> ~Application();</div>
<div class="line"></div>
<div class="line">  <span class="keywordtype">void</span> run();</div>
<div class="line"></div>
<div class="line"><span class="keyword">private</span>:</div>
<div class="line">  <a name="_a5"></a><a class="code" href="classGlib_1_1RefPtr.html">Glib::RefPtr&lt;Glib::MainLoop&gt;</a>  main_loop_;</div>
<div class="line">  <a name="_a6"></a><a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00965.html">std::vector&lt;ThreadProgress*&gt;</a>  progress_threads_;</div>
<div class="line"></div>
<div class="line">  <span class="keywordtype">void</span> launch_threads();</div>
<div class="line">  <span class="keywordtype">void</span> on_progress_finished(ThreadProgress* thread_progress);</div>
<div class="line">};</div>
<div class="line"></div>
<div class="line"><span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="line"><span class="keyword">class </span>DeletePtr : <span class="keyword">public</span> <a name="_a7"></a><a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00948.html">std::unary_function</a>&lt;void, T&gt;</div>
<div class="line">{</div>
<div class="line"><span class="keyword">public</span>:</div>
<div class="line">  <span class="keywordtype">void</span> operator()(T ptr)<span class="keyword"> const </span>{ <span class="keyword">delete</span> ptr; }</div>
<div class="line">};</div>
<div class="line"></div>
<div class="line">ThreadProgress::ThreadProgress(<span class="keywordtype">int</span> <span class="keywordtype">id</span>)</div>
<div class="line">:</div>
<div class="line">  thread_   (0),</div>
<div class="line">  id_       (<span class="keywordtype">id</span>),</div>
<div class="line">  progress_ (0)</div>
<div class="line">{</div>
<div class="line">  <span class="comment">// Connect to the cross-thread signal.</span></div>
<div class="line">  signal_increment_.connect(<a name="a8"></a><a class="codeRef" href="http://library.gnome.org/devel/libsigc++/unstable/group__mem__fun.html#gadf6b6d22c503b439019f0a2e77352419">sigc::mem_fun</a>(*<span class="keyword">this</span>, &amp;ThreadProgress::progress_increment));</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line">ThreadProgress::~ThreadProgress()</div>
<div class="line">{</div>
<div class="line">  <span class="comment">// It is an error if the thread is still running at this point.</span></div>
<div class="line">  g_return_if_fail(thread_ == 0);</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">int</span> ThreadProgress::id()<span class="keyword"> const</span></div>
<div class="line"><span class="keyword"></span>{</div>
<div class="line">  <span class="keywordflow">return</span> id_;</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> <a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01646.html#ga6f4ad125d364f01560e2ed20a3c8bb5b">ThreadProgress::launch</a>()</div>
<div class="line">{</div>
<div class="line">  <span class="comment">// Create a joinable thread.</span></div>
<div class="line">  thread_ = <a name="a9"></a><a class="code" href="classGlib_1_1Threads_1_1Thread.html#ad89d142f0a9fd02d476dbed49dd17b85">Glib::Threads::Thread::create</a>(<a class="codeRef" href="http://library.gnome.org/devel/libsigc++/unstable/group__mem__fun.html#gadf6b6d22c503b439019f0a2e77352419">sigc::mem_fun</a>(*<span class="keyword">this</span>, &amp;ThreadProgress::thread_function));</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> ThreadProgress::join()</div>
<div class="line">{</div>
<div class="line">  thread_-&gt;join();</div>
<div class="line">  thread_ = 0;</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">bool</span> ThreadProgress::unfinished()<span class="keyword"> const</span></div>
<div class="line"><span class="keyword"></span>{</div>
<div class="line">  <span class="keywordflow">return</span> (progress_ &lt; ITERATIONS);</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><a class="codeRef" href="http://library.gnome.org/devel/libsigc++/unstable/classsigc_1_1signal.html">sigc::signal&lt;void&gt;</a>&amp; ThreadProgress::signal_finished()</div>
<div class="line">{</div>
<div class="line">  <span class="keywordflow">return</span> signal_finished_;</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> ThreadProgress::progress_increment()</div>
<div class="line">{</div>
<div class="line">  ++progress_;</div>
<div class="line">  <a name="a10"></a>std::cout &lt;&lt; <span class="stringliteral">&quot;Thread &quot;</span> &lt;&lt; id_ &lt;&lt; <span class="stringliteral">&quot;: &quot;</span> &lt;&lt; progress_ &lt;&lt; <span class="charliteral">&#39;%&#39;</span> &lt;&lt; <a name="a11"></a><a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01616.html#a8b3758bb8f17c440c7963363f42f69f3">std::endl</a>;</div>
<div class="line"></div>
<div class="line">  <span class="keywordflow">if</span> (progress_ &gt;= ITERATIONS)</div>
<div class="line">    signal_finished_();</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> ThreadProgress::thread_function()</div>
<div class="line">{</div>
<div class="line">  <a name="_a12"></a><a class="code" href="classGlib_1_1Rand.html">Glib::Rand</a> rand;</div>
<div class="line"></div>
<div class="line">  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; ITERATIONS; ++i)</div>
<div class="line">  {</div>
<div class="line">    <a name="a13"></a><a class="code" href="namespaceGlib.html#a5d75264c8b47f13fb33f973b0d4fc73e">Glib::usleep</a>(rand.<a name="a14"></a><a class="code" href="classGlib_1_1Rand.html#a182b9a36db153d316baf5efb1ece9fd7">get_int_range</a>(2000, 20000));</div>
<div class="line"></div>
<div class="line">    <span class="comment">// Tell the main thread to increment the progress value.</span></div>
<div class="line">    signal_increment_();</div>
<div class="line">  }</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line">Application::Application()</div>
<div class="line">:</div>
<div class="line">  main_loop_        (<a name="a15"></a><a class="code" href="classGlib_1_1MainLoop.html#a37a1dcf3cb167cf02260111f533d0b5b">Glib::MainLoop::create</a>()),</div>
<div class="line">  progress_threads_ (5)</div>
<div class="line">{</div>
<div class="line">  <span class="keywordflow">try</span></div>
<div class="line">  {</div>
<div class="line">    <span class="keywordflow">for</span> (<a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00965.html">std::vector&lt;ThreadProgress*&gt;::size_type</a> i = 0; i &lt; progress_threads_.<a name="a16"></a><a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00965.html#aedc1ee21f6ca2b8304b4f1f430125c8d">size</a>(); ++i)</div>
<div class="line">    {</div>
<div class="line">      ThreadProgress *<span class="keyword">const</span> progress = <span class="keyword">new</span> ThreadProgress(i + 1);</div>
<div class="line">      progress_threads_[i] = progress;</div>
<div class="line"></div>
<div class="line">      progress-&gt;signal_finished().connect(</div>
<div class="line">          sigc::bind&lt;1&gt;(<a class="codeRef" href="http://library.gnome.org/devel/libsigc++/unstable/group__mem__fun.html#gadf6b6d22c503b439019f0a2e77352419">sigc::mem_fun</a>(*<span class="keyword">this</span>, &amp;Application::on_progress_finished), progress));</div>
<div class="line">    }</div>
<div class="line">  }</div>
<div class="line">  <span class="keywordflow">catch</span> (...)</div>
<div class="line">  {</div>
<div class="line">    <span class="comment">// In your own code, you should preferably use a smart pointer</span></div>
<div class="line">    <span class="comment">// to ensure exception safety.</span></div>
<div class="line">    <a name="a17"></a><a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01659.html#ga36d3b88a382b4ad3bf55aff3f597522d">std::for_each</a>(progress_threads_.begin(), progress_threads_.end(),</div>
<div class="line">                  DeletePtr&lt;ThreadProgress*&gt;());</div>
<div class="line">    <span class="keywordflow">throw</span>;</div>
<div class="line">  }</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line">Application::~Application()</div>
<div class="line">{</div>
<div class="line">  <a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01659.html#ga36d3b88a382b4ad3bf55aff3f597522d">std::for_each</a>(progress_threads_.begin(), progress_threads_.end(),</div>
<div class="line">                DeletePtr&lt;ThreadProgress*&gt;());</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> Application::run()</div>
<div class="line">{</div>
<div class="line">  <span class="comment">// Install a one-shot idle handler to launch the threads.</span></div>
<div class="line">  <a name="a18"></a><a class="code" href="group__MainLoop.html#ga76792522d9680a05e232d3519a25f98d">Glib::signal_idle</a>().<a name="a19"></a><a class="code" href="classGlib_1_1SignalIdle.html#a94217dc63e35f96b5cee4c48f2cdd020">connect_once</a>(<a class="codeRef" href="http://library.gnome.org/devel/libsigc++/unstable/group__mem__fun.html#gadf6b6d22c503b439019f0a2e77352419">sigc::mem_fun</a>(*<span class="keyword">this</span>, &amp;Application::launch_threads));</div>
<div class="line"></div>
<div class="line">  main_loop_-&gt;run();</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> Application::launch_threads()</div>
<div class="line">{</div>
<div class="line">  std::cout &lt;&lt; <span class="stringliteral">&quot;Launching &quot;</span> &lt;&lt; progress_threads_.size() &lt;&lt; <span class="stringliteral">&quot; threads:&quot;</span> &lt;&lt; <a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01616.html#a8b3758bb8f17c440c7963363f42f69f3">std::endl</a>;</div>
<div class="line"></div>
<div class="line">  <a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01659.html#ga36d3b88a382b4ad3bf55aff3f597522d">std::for_each</a>(progress_threads_.begin(), progress_threads_.end(),</div>
<div class="line">                <a name="a20"></a><a class="codeRef" href="http://library.gnome.org/devel/libsigc++/unstable/group__mem__fun.html#gadf6b6d22c503b439019f0a2e77352419">std::mem_fun</a>(&amp;<a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01646.html#ga6f4ad125d364f01560e2ed20a3c8bb5b">ThreadProgress::launch</a>));</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> Application::on_progress_finished(ThreadProgress* thread_progress)</div>
<div class="line">{</div>
<div class="line">  thread_progress-&gt;join();</div>
<div class="line"></div>
<div class="line">  std::cout &lt;&lt; <span class="stringliteral">&quot;Thread &quot;</span> &lt;&lt; thread_progress-&gt;id() &lt;&lt; <span class="stringliteral">&quot;: finished.&quot;</span> &lt;&lt; <a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01616.html#a8b3758bb8f17c440c7963363f42f69f3">std::endl</a>;</div>
<div class="line"></div>
<div class="line">  <span class="comment">// Quit if it was the last thread to be joined.</span></div>
<div class="line">  <span class="keywordflow">if</span> (<a name="a21"></a><a class="codeRef" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01659.html#gaaf6e9995ebbd27994d7c73b375f86088">std::find_if</a>(progress_threads_.begin(), progress_threads_.end(),</div>
<div class="line">                   <a class="codeRef" href="http://library.gnome.org/devel/libsigc++/unstable/group__mem__fun.html#gadf6b6d22c503b439019f0a2e77352419">std::mem_fun</a>(&amp;ThreadProgress::unfinished)) == progress_threads_.end())</div>
<div class="line">  {</div>
<div class="line">    main_loop_-&gt;quit();</div>
<div class="line">  }</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line">} <span class="comment">// anonymous namespace</span></div>
<div class="line"></div>
<div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">int</span>, <span class="keywordtype">char</span>**)</div>
<div class="line">{</div>
<div class="line">  <a name="a22"></a><a class="code" href="namespaceGlib.html#ac90aee10d0b90e3d8a96a86b5394f87b">Glib::init</a>();</div>
<div class="line"></div>
<div class="line">  Application application;</div>
<div class="line">  application.run();</div>
<div class="line"></div>
<div class="line">  <span class="keywordflow">return</span> 0;</div>
<div class="line">}</div>
</div><!-- fragment --> </div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Mon Sep 22 2014 21:38:30 for glibmm by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.7
</small></address>
</body>
</html>