Thread ->CPU 100%
-
Hi
Ich habe eine Applikation welche in mehreren Threads läuft.
In den einzelnen Funktionen, welche im neuen Thread laufen, habe ich eine Endlosschlaufe, damit der Thread immer weiter läuft. (Brauche Timer die im neuen Thread laufen, etc.)
Das ganze funktioniert auch. Mein Problem ist nun einfach, dass die CPU-Auslastung immer auf 100% geht! Gibt es irgend eine Möglichkeit diese zu senken? In den neuen Threads werden Daten erfasst und geloggt, aus diesem Grund kann der Thread nicht zwischenzeitlich beendet werden....
Was gibt es für Alternativen um die Auslastung zu senken?
-
bau in jeden thread ein Sleep() ein. ca. 100ms oder so. das wirkt wunder
-
Diese Idee hatte ich auch schon, wird dadurch nur diese Thread gestoppt?
Wie sieht es aus mit den Timern? Diese werden dann auch nicht ausgeführt oder?
Das Problem ist, dass die Timer welche ich zur Zeit auf 500ms gesetzt habe, immer dann aufgerufen werden müssen. (Senden ein Testsignal zu Microcontrollern)
-
ja, die threads werden während eines Sleep() suspendiert. du kannst jedoch SleepEx() verwenden, wenn du den thread eher zum leben erwecken willst. es gibt für sowas viele möglichkeiten. eine wär z.b. die threads grundsätzlich nur bei gewissen events aufzuwecken. guckst du: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waitforsingleobject.asp
-
Was für Timer!? Du könntest die Multimedia-Timer verwenden, anstatt sie selber zu machen
-
Was sind Multimedia Timer und wie benutze ich diese?
Ich benutze bis jetzt einfach die Windowsfunktion SetTimer();
-
Wenn Du "SetTimer" verwendest, verstehe ich nicht warum Du eine Endlosschleife hast!?
MM-Timers:
http://msdn.microsoft.com/library/en-us/multimed/htm/_win32_multimedia_timers.asp
-
Die Timer dienen nur zum Senden von Testsignalen über die Serielle Schnittstelle.
Die Hauptschleife empfängt Daten und verarbeitet diese und stellt sie schlussendlich den anderen Thread zum Weiterverarbeiten zur Verfügung...
-
Dann verwende doch bitte eine fertige serielle Klasse, die das ganze Ereignis-Orientiert macht...
http://www.codeproject.com/system/serial.asp
-
Das Problem ist ich muss dies selber machen, da es ein Probelauf für einen Test ist!
Das ganze ist auch nicht Ereignissorientiert, da der Computer das Testsignal senden muss und dann eine Antwort empfängt.
Die SleepEx() Funktion wird ja unterbrochen, wenn der Timer ausgeführt werden soll oder?
-
Wenn es nicht ereignisorientiert ist, warum wunderst Du Dich üer 10% CPU-Auslastung !?
Und SleepEx kommt nicht zurück, wenn Dein "OnTimer" anspricht... das wartet schön bis die Zeit abgelaufen ist. Anders sieht es hier vermutlich bei den MM-Timern aus... aber da brauchst Du kein Sleep, da dies ja ereignisgesteuert ist...
-
Ereignisorientiert heisst für mich, es wird etwas ausgeführt wenn ein bestimmter Fall eintritt.
Dies ist ja bei mir nicht der Fall. Ich wundere mich nicht über die 100% CPU-Auslastung. Ich denke nur, dass es eine Möglichkeit geben muss, diese zu senken....
Die MM-Timer interessieren mich schon, ich bin nur noch nicht ganz sicher, ob diese auch wirklich das machen, was ich möchte...
Die Klasse, welche in einem neuen Thread läuft macht nichts anderes als die Kommunikation zwischen einem MC und dem PC sicherzustellen.
Die Klasse muss alle 500ms ein Testsignal an den MC senden. Der MC antwortet darauf. Nebenbei senden die Klasse noch andere "Befehle" an den MC welche er auch immer bestätigt. Es kann aber auch sein, dass der MC von sich aus eine Meldung sendet. Aus diesem Grund habe ich ja diese Schlaufe, welche ständig überprüft ob Daten zu senden oder empfangen sind. Nebenbei wird dann aber immer noch das Testsignal übermittelt...
-
Warum setzte Du nicht die Timeouts für den Empfang von der seriellen Schnittstelle auf 500ms und wenn dieser Timeout auftritt, weisst Du dass Du einen "Ping" senden musst... (SetCommTimeouts)
-
Dies ist eine gute Idee...
Wie sieht es denn damit aus, wenn ich z.B einstelle dass ich 128 Zeichen empfangen möchte, jedoch nur 20 Zeichen kommen und dann das Timeout erreicht wird... Sind diese 20 Zeichen trotzdem im Speicher?
-
Ja, dann liefert er halt nach 500 ms nur diese 20 Bytes zurück (und setzt dies auch entsprechend in "lpNumberOfBytesRead").