Thread ->CPU 100%
-
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").