<?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[Timer...]]></title><description><![CDATA[<p>Liebe C-PlusPlus-Forum,</p>
<p>ich habe ein kleines Problem und erhoffe mir eure Hilfe :). Es geht darum, dass ich Millisekunden genau arbeiten muss und das Programm nicht unnötig auf einer 100% Last haben möchte. Aber der Reihe nach.</p>
<p>Ich möchte, dass alle X ms bestimmte Methoden ausgeführt werden. Dabei sollte das ausführen ms genau sein. Ich habe herausgefunden, dass es mit den Timern der MFC nicht ganz geht, diese sind zu ungenau. Viel genauer (sogar sehr genau) geht es mit QueryPerformanceCounter(). Nun habe ich also &quot;Timer&quot; geschrieben, welche darauf basieren. Das Problem ist nun, dass meine Timer in einer while-Schleife geprüft werden, ob die Zeit dieser verstrichen ist (wie gesagt das klappt alles super).</p>
<pre><code class="language-cpp">while (TRUE) {

	// Timer prüfen und ausführen	
	pItor = m_oTimers.begin();
	while (pItor != m_oTimers.end()) {
		pTimer = pItor-&gt;second;

		// Prüfen ob der Timer ausgeführt werden muss
		if (pTimer-&gt;IsDue()) {
			// TimerFunction aufrufen
			pTimer-&gt;GetFunction();
		}
		pItor++;
	}

	// Soll die Rechnerauslastung runterschrauben (glaube ich aber nicht...)
	Sleep(0);
}
</code></pre>
<p>Nun ist aber die Systemlast der Anwendung immer auf 100% (auch ein Sleep(0) in der while-Schleife hilft da nicht).</p>
<p>Hat irgendjemand eine Idee... ich kann bestimmen wie lang die Anwendung warten kann (Sleep ist aber auch wieder sehr ungenau!). Ich bräuchte irgendwie ein Event, dass mir sehr genau sagt, dass die Zeit um ist und der nächste Timer aktiv werden soll.</p>
<p>Ich hoffe man versteht mich, ansonsten nochmals nachfragen. Ich bin für jeden Ratschlag dankbar.</p>
<p>Danke im Voraus<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/194449/timer</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Apr 2026 01:10:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194449.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 Oct 2007 09:34:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Timer... on Sun, 07 Oct 2007 09:34:02 GMT]]></title><description><![CDATA[<p>Liebe C-PlusPlus-Forum,</p>
<p>ich habe ein kleines Problem und erhoffe mir eure Hilfe :). Es geht darum, dass ich Millisekunden genau arbeiten muss und das Programm nicht unnötig auf einer 100% Last haben möchte. Aber der Reihe nach.</p>
<p>Ich möchte, dass alle X ms bestimmte Methoden ausgeführt werden. Dabei sollte das ausführen ms genau sein. Ich habe herausgefunden, dass es mit den Timern der MFC nicht ganz geht, diese sind zu ungenau. Viel genauer (sogar sehr genau) geht es mit QueryPerformanceCounter(). Nun habe ich also &quot;Timer&quot; geschrieben, welche darauf basieren. Das Problem ist nun, dass meine Timer in einer while-Schleife geprüft werden, ob die Zeit dieser verstrichen ist (wie gesagt das klappt alles super).</p>
<pre><code class="language-cpp">while (TRUE) {

	// Timer prüfen und ausführen	
	pItor = m_oTimers.begin();
	while (pItor != m_oTimers.end()) {
		pTimer = pItor-&gt;second;

		// Prüfen ob der Timer ausgeführt werden muss
		if (pTimer-&gt;IsDue()) {
			// TimerFunction aufrufen
			pTimer-&gt;GetFunction();
		}
		pItor++;
	}

	// Soll die Rechnerauslastung runterschrauben (glaube ich aber nicht...)
	Sleep(0);
}
</code></pre>
<p>Nun ist aber die Systemlast der Anwendung immer auf 100% (auch ein Sleep(0) in der while-Schleife hilft da nicht).</p>
<p>Hat irgendjemand eine Idee... ich kann bestimmen wie lang die Anwendung warten kann (Sleep ist aber auch wieder sehr ungenau!). Ich bräuchte irgendwie ein Event, dass mir sehr genau sagt, dass die Zeit um ist und der nächste Timer aktiv werden soll.</p>
<p>Ich hoffe man versteht mich, ansonsten nochmals nachfragen. Ich bin für jeden Ratschlag dankbar.</p>
<p>Danke im Voraus<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379557</guid><dc:creator><![CDATA[Kurt80]]></dc:creator><pubDate>Sun, 07 Oct 2007 09:34:02 GMT</pubDate></item><item><title><![CDATA[Reply to Timer... on Sun, 07 Oct 2007 10:49:19 GMT]]></title><description><![CDATA[<p>1. Windows ist kein Echtezti-OS somit sind ms-genau Timer unmöglich<br />
2. Wenn es annähernd geht, dann nur mit den Multi-Media Timern (timeBeginPeriod/timeSetEvent)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379586</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Sun, 07 Oct 2007 10:49:19 GMT</pubDate></item><item><title><![CDATA[Reply to Timer... on Mon, 08 Oct 2007 06:34:40 GMT]]></title><description><![CDATA[<p>Wie genau brauchst Du es denn? SetTimer ist dafür da eine Funktion OnTimer wiederholt aufzurufen. Die Multimedia-Timer und auch QueryPerformanceCounter() sind dafür da, Zeitdifferenzen zu messen. Mit letzterem kommt man auch sehr genau unter die 1 ms Schranke. Das heißt nicht, dass man Funktionen zeitgenau aufrufen kann. Das liegt, wie Jochen schon sagte, das Windows kein Echtzeit-OS ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380212</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Mon, 08 Oct 2007 06:34:40 GMT</pubDate></item><item><title><![CDATA[Reply to Timer... on Mon, 08 Oct 2007 07:38:10 GMT]]></title><description><![CDATA[<p>Also mit dem QueryPerformanceTimer() bin ich eigentlich sehr genau. Soll heißen mir reicht diese Genauigkeit (nach meinen Messungen liegt diese wie Andy schrieb unter der 1ms). Die Funktion möchte ich schon &quot;ziemlich&quot; zeitgenau aufrufen. Wie gesagt klappt das bis jetzt auch gut mit der unten genannten Methode. Die Methode IsDue vergleicht dabei den letzten Aufruf mit der &quot;aktuellen Zeit&quot; (über QueryPerformanceTimer). Das Problem ist nur das mein Programm immer eine Systemlast von 100% hat. Das liegt natürlich daran, dass die Schleife voll läuft. Von daher suche ich dafür eine LÖsung :).</p>
<p>Gibt es eine Seite um nachzusehen wie genau die Timer sind und auf denen einige aufgelistet sind. Ich habe gelesen, dass der Timer von Windows (OnTimer, SetTimer, ...) um die +/-50ms ungenau ist. Wie ist es mit Timeouts unter Windows? Wie genau ist z.B. der WaitForSingleObject Timeout? Gibt der annähernd im ms Bereich zurück in dem man das ganze angibt oder ist da auch ein Versatz von 50ms drin?</p>
<p>Mit ist schon klar, dass Windows kein Echtzeitsystem ist und dass es bei starker Auslastung auch zu Differenzen kommen kann. Nicht desto trotz, möchte ich schon annähernd gute Ergebnisse erhalten. Deswegen jetzt schonmal vielen Dank für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380239</guid><dc:creator><![CDATA[Kurt80]]></dc:creator><pubDate>Mon, 08 Oct 2007 07:38:10 GMT</pubDate></item><item><title><![CDATA[Reply to Timer... on Mon, 08 Oct 2007 10:38:47 GMT]]></title><description><![CDATA[<p>Man muss glaub ich bei der SetTimer/OnTimer unterscheiden, in welchem Bereich man sich befindet. Zeiten kleiner 10 ms sind da generell nicht drin. Liegt ja auch in der Funktionsweise. Die OnTimer wird ja mittels WM_TIMER ausgelöst und die Nachrichtenbehandlung braucht seine Zeit. Ggf. läuft Deine Nachrichtenschleife zu.<br />
Das Problem mit der Systemlast hab ich auch. Dazu hatte ich vor kurzem hier schon mal einen Thread laufen. Allerdings hab ich mich jetzt damit abgefunden, da der Rechner eh nur die Maschine steuern soll und die zeitkritischen Abschnitte eher in der Minderzahl sind. Klar, elegant ist diese Lösung nicht.<br />
Seiten über timer gibts, da musst Du einfach mal googeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380354</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Mon, 08 Oct 2007 10:38:47 GMT</pubDate></item><item><title><![CDATA[Reply to Timer... on Mon, 08 Oct 2007 10:39:04 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich habe nun mal alles versucht auf Multimediatimer umzustellen. Ich war sehr begeistert als ich gesehen habe, dass diese Timer auch mit Events arbeiten können (timeSetEvent kann als dritten Parameter ein Handle auf ein Event erhalten). Nun habe ich mir gedacht, dass ich dort einfach von einem CEvent das m_hObject übergebe. Natürlich gecastet auf LPTIMECALLBACK und mit dem Parameter TIME_CALLBACK_SET. Leider geht das so nicht wirklich. Es gibt zwar keinen Fehler jedoch wird der Zeiger immer mit einer id von NULL erzeugt (was auf einen Fehler deutet). Woran kann das liegen?</p>
<p>Danke für Hilfe<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1380355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380355</guid><dc:creator><![CDATA[Kurt80]]></dc:creator><pubDate>Mon, 08 Oct 2007 10:39:04 GMT</pubDate></item><item><title><![CDATA[Reply to Timer... on Mon, 08 Oct 2007 10:47:53 GMT]]></title><description><![CDATA[<p>Die Zeile Code zum Erzeugen des Timers:</p>
<pre><code class="language-cpp">MMRESULT m_iTimerID = ::timeSetEvent(iInterval, M_IACCURACY, (LPTIMECALLBACK) m_oTimer.m_hObject, NULL, TIME_PERIODIC | TIME_CALLBACK_EVENT_SET | TIME_KILL_SYNCHRONOUS);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1380367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1380367</guid><dc:creator><![CDATA[Kurt80]]></dc:creator><pubDate>Mon, 08 Oct 2007 10:47:53 GMT</pubDate></item></channel></rss>