Thread + Update
-
Ich habe folgenden Thread:
void __fastcall TRead::Execute() { DWORD dwBytesRead; FreeOnTerminate = true; while( ! Terminated ) { memset(InBuff, 0, 100); ReadFile(hComm, InBuff, 50, &dwBytesRead, NULL); if(dwBytesRead) { Synchronize(DisplayIt); Sleep(10); continue; } else { this->Terminate(); } } }
Dieser liest von der seriellen Schnittstelle in einen Buffer. Die Methode DisplayIt verarbeitet den Buffer und zeigt das Ergebnis in einem Label an. Dieses wird ständig "geupdated". Es klappt wunderbar, allerdings kommt es immer so nach etwa 3 Sekunden vor, dass der Thread kurz steht. Erhöhe ich die Wartezeit im Sleep gibt es keine Probleme. Ich benötige allerdings die sehr kurze Wartezeit.
Kann mir jemand helfen, woran könnte es liegen?
-
Vielleicht blockiert ReadFile, weil sie auf Daten wartet
MSDN Library schrieb:
When reading from a communications device, the behavior of ReadFile is governed by the current communication time-outs as set and retrieved using the SetCommTimeouts and GetCommTimeouts functions. Unpredictable results can occur if you fail to set the time-out values. For more information about communication time-outs, see COMMTIMEOUTS.
Außerdem klingt das hier interessant:
MSDN Library schrieb:
Accessing the input buffer while a read operation is using the buffer may lead to corruption of the data read into that buffer. Applications must not read from, write to, reallocate, or free the input buffer that a read operation is using until the read operation completes.
Weiß ja nicht, ob du dabei synchronisierst...
-
Cocaine schrieb:
Außerdem klingt das hier interessant:
MSDN Library schrieb:
Accessing the input buffer while a read operation is using the buffer may lead to corruption of the data read into that buffer. Applications must not read from, write to, reallocate, or free the input buffer that a read operation is using until the read operation completes.
Danke Cocaine, hab mir mal den Buffer angeschaut. Er hat nicht die Länge, die er eigentlich haben sollte, kann ihn aber wahrscheinlich trotzdem verarbeiten. Danke, hat sich also erledigt!
-
Hab die Verarbeitung gerade weiterprogrammiert und es wäre auch möglich, doch es wäre um einiges besser, wenn man warten könnte bis der Buffer voll ist bzw. 50 Zeichen enthält. Ist das möglich?
Der Buffer ist wie folgt deklariert:
char InBuff[100];
Wenn ich lese hat der Buffer immer eine Länge von 16 bzw. 24, da ich ihn wahrscheinlich dabei unterbreche. (sollte eigentlich 50 zeichen lesen (siehe obigen code)). Kann man irgendwie warten, bis er mit den 50 Zeichen fertig ist? Beim Debuggen klappt es logischerweise immer ...
-
Naja, ReadFile gibt doch zurück, wie viele Bytes gelesen wurden. Kannst dann ja ein Event auslösen, sobald du >= 50 Bytes empfangen hast.
Allerdings ist das mittlerweile doch sehr spezifisch und sollte im WinAPI-Forum weiter behandelt werden...
-
The ReadFile function returns when one of the following conditions is met: a write operation completes on the write end of the pipe, the number of bytes requested has been read, or an error occurs.
Kann es sein, das dies etwas damit zu tun hat? Was liefert den ReadFile zurück? Falls 0: was sagt GetLastError?
-
flenders schrieb:
The ReadFile function returns when one of the following conditions is met: a write operation completes on the write end of the pipe, the number of bytes requested has been read, or an error occurs.
Kann es sein, das dies etwas damit zu tun hat? Was liefert den ReadFile zurück? Falls 0: was sagt GetLastError?
ReadFile liefert 1 zurück, nach GetLastError "Der Vorgang wurde erfolgreich beendet.".
Cocaine schrieb:
Naja, ReadFile gibt doch zurück, wie viele Bytes gelesen wurden. Kannst dann ja ein Event auslösen, sobald du >= 50 Bytes empfangen hast.
Hm, gibt ReadFile das in "LPDWORD lpNumberOfBytesRead" zurück? Wie kann ich ein Event auslösen?
Mit WaitCommEvent scheint es nicht zu funktionieren genau 50 bytes zu lesen.Cocaine schrieb:
Allerdings ist das mittlerweile doch sehr spezifisch und sollte im WinAPI-Forum weiter behandelt werden...
Jup ist glaub ich besser, verschiebt es am besten.
-
1.) Du bist doch bereits verschoben worden
2.) Rufe doch einfach Readfile in einer Schleife sooft auf, bis die Summe der jeweiligen dwBytesRead 50 ist
-
flenders schrieb:
2.) Rufe doch einfach Readfile in einer Schleife sooft auf, bis die Summe der jeweiligen dwBytesRead 50 ist
Jo, danke, so werd ich es wahrscheinlich machen. Btw, sehr gute Community.