<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Verständnisfrage zu Boost Thread als TimerChecker]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>ich habe da mal eine Verständnisfrage: Es geht um einen Timer innerhalb einer Klasse, den ich per Thread periodisch überwachen will. Dazu leg ich den Überwachungs-Thread alle paar Sekunden schlafen.</p>
<pre><code class="language-cpp">#include &lt;boost/timer.hpp&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/thread.hpp&gt;

#include &lt;iostream&gt;

class Timer
{
	public:
		Timer() : timeCheckThread(boost::bind(&amp;Timer::checkTime, this)) {}

		~Timer() {std::cerr &lt;&lt; &quot;bye &quot;;  timeCheckThread.join(); std::cerr &lt;&lt; &quot;now&quot;;}

	private:
		void checkTime()
		{
			double elapsed;
			boost::xtime time;

			boost::timer timer;

			while ((elapsed=timer.elapsed()) &lt; 10)
			{
				//boost::xtime_get(&amp;time, boost::TIME_UTC);
				//time.sec += 3;

				//boost::thread::sleep(time);
			}

			std::cerr &lt;&lt; &quot;TimeOut&quot; &lt;&lt; std::endl;
		}

		boost::thread timeCheckThread;
};

int main()
{
	Timer t;
}
</code></pre>
<p>Das Interessante ist, dass es mit dem auskommentierten Code (also &quot;ständig&quot; überwachen) zum erwarteten Output kommt. Leg ich den Thread dagegen schlafen, liefert mir elapsed() dagegen immer 0.0 und der Thread kann nicht terminieren.</p>
<p>Liegt es vielleicht daran an dem join() im Destruktor, dass da vorher schon was gelöscht wird? Meine Überlegung mit dieser Implementation war eigentlich, dass das Objekt tatsächlich erst verschwindet, wenn der Timer fertig ist.</p>
<p>Boost-Version ist noch die alte, 1.33... Ausprobiert mit gcc 4.2.1.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219078/verständnisfrage-zu-boost-thread-als-timerchecker</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 08:53:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219078.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Jul 2008 15:21:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisfrage zu Boost Thread als TimerChecker on Tue, 29 Jul 2008 15:21:05 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>ich habe da mal eine Verständnisfrage: Es geht um einen Timer innerhalb einer Klasse, den ich per Thread periodisch überwachen will. Dazu leg ich den Überwachungs-Thread alle paar Sekunden schlafen.</p>
<pre><code class="language-cpp">#include &lt;boost/timer.hpp&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/thread.hpp&gt;

#include &lt;iostream&gt;

class Timer
{
	public:
		Timer() : timeCheckThread(boost::bind(&amp;Timer::checkTime, this)) {}

		~Timer() {std::cerr &lt;&lt; &quot;bye &quot;;  timeCheckThread.join(); std::cerr &lt;&lt; &quot;now&quot;;}

	private:
		void checkTime()
		{
			double elapsed;
			boost::xtime time;

			boost::timer timer;

			while ((elapsed=timer.elapsed()) &lt; 10)
			{
				//boost::xtime_get(&amp;time, boost::TIME_UTC);
				//time.sec += 3;

				//boost::thread::sleep(time);
			}

			std::cerr &lt;&lt; &quot;TimeOut&quot; &lt;&lt; std::endl;
		}

		boost::thread timeCheckThread;
};

int main()
{
	Timer t;
}
</code></pre>
<p>Das Interessante ist, dass es mit dem auskommentierten Code (also &quot;ständig&quot; überwachen) zum erwarteten Output kommt. Leg ich den Thread dagegen schlafen, liefert mir elapsed() dagegen immer 0.0 und der Thread kann nicht terminieren.</p>
<p>Liegt es vielleicht daran an dem join() im Destruktor, dass da vorher schon was gelöscht wird? Meine Überlegung mit dieser Implementation war eigentlich, dass das Objekt tatsächlich erst verschwindet, wenn der Timer fertig ist.</p>
<p>Boost-Version ist noch die alte, 1.33... Ausprobiert mit gcc 4.2.1.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555757</guid><dc:creator><![CDATA[GaanzKurz]]></dc:creator><pubDate>Tue, 29 Jul 2008 15:21:05 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Boost Thread als TimerChecker on Tue, 29 Jul 2008 15:46:54 GMT]]></title><description><![CDATA[<p>Lass Dir mal ausgeben wieviele ms Du tasächlich schläfst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555772</guid><dc:creator><![CDATA[tenmpläd]]></dc:creator><pubDate>Tue, 29 Jul 2008 15:46:54 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Boost Thread als TimerChecker on Tue, 29 Jul 2008 15:58:14 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">boost::xtime_get(&amp;time, boost::TIME_UTC);
</code></pre>
<p>Das holt dir die aktuelle Zeit in Sekunden seit dem 1.1.1970, was glaub ich ca. 1,2 Milliarden Sekunden sind. Solange wartet dein Sleep dann :p</p>
<p>Übrigens, die aktuelle Boost Version ist bereits 1.35.0 und 1.36.0 geht bald oder ist schon in der Beta. Wäre vielleicht schon mal Zeit die neue Version zu holen. Da funktioniert das Sleep dann auch über Boost.DateTime. Dann musst du wirklich eine TimeDuration übergeben, dürfte weniger Fehleranfällig sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Im übrigen weiss ich nicht, ob das wirklich so guter Stil ist, in einem Destruktor auf einen Thread zu warten.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555778</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 29 Jul 2008 15:58:14 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Boost Thread als TimerChecker on Tue, 29 Jul 2008 16:56:37 GMT]]></title><description><![CDATA[<blockquote>
<p>Im übrigen weiss ich nicht, ob das wirklich so guter Stil ist, in einem Destruktor auf einen Thread zu warten.</p>
</blockquote>
<p>Wenn der Thread garantiert &quot;bald mal&quot; terminiert, und Deadlocks ausgeschlossen werden können, dann sehe ich da kein Problem.</p>
<p>Viele Sachen die Leute häufig in einem Dtor aufrufen können recht lange blockieren, ist für mich kein grundlegender Unterschied ob es jetzt um ein join() auf einen Thread geht oder um IO oder sonstwas.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555808</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 29 Jul 2008 16:56:37 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Boost Thread als TimerChecker on Tue, 29 Jul 2008 17:16:28 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a> und tenmpläd: Das Schlafen ist wirklich nicht das Problem. Wenn die Kommentare wieder rauskommen, schläft der Thread wirklich und wird nach der angegebenen Zeit aktiviert, d.h. alle 3 Sekunden in diesem Fall kommt ein Output.</p>
<p>Nur das elapsed() immer 0.0 liefert, der Thread dies ausspuckt und nicht beendet.</p>
<p>Ob das mit dem join() im Dtor guter Stil ist, hmm, kenn mich noch nicht allzugut in der MT-Programmierung aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Hab mich auch schon gefragt, ob es an der Boost-Version liegt (Implementation hab ich bloss mal überflogen und die Docs konnten mir nicht weiterhelfen). Derzeit wird leider noch an allen Rechnern mit dieser Version gearbeitet.</p>
<p>Vielleicht begreif ich aber auch irgendwas Grundlegendes nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555826</guid><dc:creator><![CDATA[GaanzKurz]]></dc:creator><pubDate>Tue, 29 Jul 2008 17:16:28 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Boost Thread als TimerChecker on Wed, 30 Jul 2008 17:41:00 GMT]]></title><description><![CDATA[<p>Hab mal grad den Quelltext mit Boost 1.35 compiliert und ausgeführt. Auch mit der Verwendung von boost::this_thread::sleep, schreibt der Thread periodisch elapsed = 0.0, ohne dagegen verändert sich der Wert wie erwartet.</p>
<p>Wie kann das sleep einen Einfluss auf die Uhrzeit haben??? boost:<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/23f2.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--timer_clock"
      title=":timer:"
      alt="⏲"
    />:elapsed() fragt doch bloss std::clock() ab, warum verändert sich dieser Wert nur nicht, wenn der CheckerThread mal kurz schläft? Und sonst schon, wenn er &quot;ständig&quot; drauf zugreift???</p>
<pre><code class="language-cpp">#include &lt;boost/timer.hpp&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/thread.hpp&gt;

#include &lt;iostream&gt;

class Timer
{
	public:
		Timer() : timeCheckThread(boost::bind(&amp;Timer::checkTime, this)) {}

		~Timer() {std::cerr &lt;&lt; &quot;bye &quot;;  timeCheckThread.join(); std::cerr &lt;&lt; &quot;now&quot;;}

	private:
		void checkTime()
		{
			double elapsed;			
			boost::timer timer;

			while ((elapsed=timer.elapsed()) &lt; 10)
			{
				//boost::this_thread::sleep(boost::posix_time:: milliseconds(2000));

				std::cerr &lt;&lt; elapsed() &lt;&lt; std::endl;

			}

			std::cerr &lt;&lt; &quot;TimeOut&quot; &lt;&lt; std::endl;
		}

		boost::thread timeCheckThread;
};

int main()
{
	Timer t;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1556557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556557</guid><dc:creator><![CDATA[GaanzKurz]]></dc:creator><pubDate>Wed, 30 Jul 2008 17:41:00 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Boost Thread als TimerChecker on Wed, 30 Jul 2008 18:54:10 GMT]]></title><description><![CDATA[<p>tu mal reindebuggen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556602</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 30 Jul 2008 18:54:10 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Boost Thread als TimerChecker on Thu, 31 Jul 2008 10:06:01 GMT]]></title><description><![CDATA[<p>Also so wie es aussieht, scheint das sleep einen Einfluss auf std::clock() zu haben.</p>
<p>Nehm ich das sleep rein, liefert std::clock() immer Null. Sehr merkwürdig???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556908</guid><dc:creator><![CDATA[GaanzKurz]]></dc:creator><pubDate>Thu, 31 Jul 2008 10:06:01 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Boost Thread als TimerChecker on Thu, 31 Jul 2008 10:19:00 GMT]]></title><description><![CDATA[<p>Also bei mir gibt er mit VS2003/05 und boost 1.35 mit dem sleep</p>
<pre><code>0
~2
~4
~6
~8
TimeOut
bye now
</code></pre>
<p>aus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556920</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Thu, 31 Jul 2008 10:19:00 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Boost Thread als TimerChecker on Thu, 31 Jul 2008 10:35:14 GMT]]></title><description><![CDATA[<p>Sehr interessant.</p>
<p>Nachdem ich mal noch im Web gesucht, kam ich auf folgenden Link</p>
<p><a href="http://www.gerd-riesselmann.net/development/std-clock-threading-and-linux" rel="nofollow">http://www.gerd-riesselmann.net/development/std-clock-threading-and-linux</a></p>
<p>Mit dem Workaround funktioniert es wie erwartet (wobei xtime_get auch std::clock verwendet, hmm):</p>
<pre><code class="language-cpp">#include &lt;boost/timer.hpp&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/thread.hpp&gt;
#include &lt;boost/lexical_cast.hpp&gt;

#include &lt;iostream&gt;
#include &lt;iomanip&gt;

class XTimer 
{ 
	public:
		XTimer() { xtime_get(&amp;_start_time, boost::TIME_UTC); }
		XTimer(const XTimer&amp; other) : _start_time(other._start_time) { } 
		~XTimer() { } 

		double elapsed() const
		{
			boost::xtime now; xtime_get(&amp;now, boost::TIME_UTC);
			return boost::lexical_cast&lt;double&gt;(now.sec - _start_time.sec);
		} 

	private: boost::xtime _start_time; 
}; 

class Timer
{
	public:
		Timer() : timeCheckThread(boost::bind(&amp;Timer::checkTime, this)) {}
		~Timer() {std::cerr &lt;&lt; &quot;bye &quot;;  timeCheckThread.join(); std::cerr &lt;&lt; &quot;now&quot;;}

	private:
		void checkTime()
		{
			double elapsed;
			XTimer timer;

			while ((elapsed=timer.elapsed()) &lt; 10)
			{
				boost::this_thread::sleep(boost::posix_time:: milliseconds(2000));

                std::cerr &lt;&lt; elapsed() &lt;&lt; std::endl;
			}
			std::cerr &lt;&lt; &quot;TimeOut&quot; &lt;&lt; std::endl;
		}

		boost::thread timeCheckThread;
};

int main()
{
	Timer t;
}
</code></pre>
<p>Hier wird also nicht der boost::timer verwendet, sondern nur auf xtime zurückgegriffen. Trotzdem find ich das strange...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556932</guid><dc:creator><![CDATA[GaanzKurz]]></dc:creator><pubDate>Thu, 31 Jul 2008 10:35:14 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Boost Thread als TimerChecker on Thu, 31 Jul 2008 10:44:11 GMT]]></title><description><![CDATA[<p>Ich korrigiere mich: Ob xtime_get std::clock() ist nicht gegeben, da die Implementation verborgen ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556941</guid><dc:creator><![CDATA[GaanzKurz]]></dc:creator><pubDate>Thu, 31 Jul 2008 10:44:11 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Boost Thread als TimerChecker on Thu, 31 Jul 2008 11:05:39 GMT]]></title><description><![CDATA[<p>Ich denke, ich hab die Lösung:</p>
<p>Unter Linux gibt std::clock() die CPU-Zeit für den aktuellen Thread seit Start zurück. Da die while-Schleife nix weiter tut, ausser den Thread sofort wieder schlafen zu legen (und der die Kontrolle wieder abgibt) wird &quot;keine&quot; Zeit verbraucht.</p>
<p>elapsed() gibt also richtig 0 (.0000x) was zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556958</guid><dc:creator><![CDATA[GaanzKurz]]></dc:creator><pubDate>Thu, 31 Jul 2008 11:05:39 GMT</pubDate></item></channel></rss>