OVERLAPPED
-
Tach,
Ich hab mich heute etwas mit ReadFile auseinandergesetzt und im Forum auch das ein oder andere gefunden zum Thema. Trotzdem noch eine Frage:
Was bezweckt der Parameter OVERLAPPED und wie implementiere ich eine OVERLAPPED-Abfrage (is garnicht so einfach, wie ich finde...)
Ich bin Newbie in C/C++ und im Forum hier scheint der ein oder andere Ahnung vom Thema zu haben...
Danke jetzt schon...
-
einfaches bsp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/readfile.aspsollte alle fragen beantworten
-
damit kannste readfile/writefile usw. im hintergrund ablaufen lassen. wenn die was zu melden haben (datei geschrieben oder so), bekommste ein event-objekt gesetzt. guckst du: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/synchronization_and_overlapped_input_and_output.asp
-
Das war Fix... Danke für die Antworten...
-
Guten Tach,
Ich bin euern Tipps, munter nachgegengen und hab mir was Nettes gebastelt (hat noch 'n paar Zeilen drin, die etwas blödsinnig daher kommen, die währen dann für Testzwecke):
CHAR handleCOMPort::getIO() { char inBuffer; OVERLAPPED gOverlapped; DWORD lpEvtMask; DWORD nBytesRead; DWORD dwError; BOOL bResult; memset(&gOverlapped,0,sizeof(gOverlapped)); // set up overlapped structure fields // gOverlapped.Offset = 0; // gOverlapped.OffsetHigh = 0; gOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // verify that sizeof(inBuffer <= nBytestoRead) SetCommMask(hCom, EV_RXCHAR | EV_RXFLAG); //PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); while(TRUE) { if(TRUE)//(WaitCommEvent(hCom, &lpEvtMask, &gOverlapped)) { if(!ReadFile(hCom, &inBuffer, 1, &nBytesRead, &gOverlapped)) { // deal with the error code switch(dwError = GetLastError()) { case ERROR_HANDLE_EOF: { // we have reached the end of the file // during the call to ReadFile // code to handle that } case ERROR_IO_PENDING: { // asynchronous i/o is still in progress // do something else for a while //GoDoSomethingElse() ; // check on the results of the asynchronous read // if there was a problem ... if (!GetOverlappedResult(hCom, &gOverlapped, &nBytesRead, TRUE)) { printf("Error"); // deal with the error code switch (dwError = GetLastError()) { case ERROR_HANDLE_EOF: { printf("ERROR EOF\n"); // we have reached the end of // the file during asynchronous // operation break; } case ERROR_IO_INCOMPLETE: { printf("IO Incomplete\n"); // we have reached the end of // the file during asynchronous // operation break; } default: { printf("ERROR DEFAULT\n"); break; } // deal with other error cases } //end switch (dwError = GetLastError()) } } // end case // deal with other error cases, such as the default } // end switch (dwError = GetLastError()) } // end if else { printf("CHAR: %c\n", inBuffer); return inBuffer; } break; } else { printf("TEST"); } } //printf("CHAR: %c\n", inBuffer); return FALSE; }Aufgerufen soll das ganze aus einem Thread heraus werden, mit ner kleinen Schlaufe, bei mir zum testen wie folgt:
for(int i = 0; i < 200; i++){ char x; if(x = COMPort1.getIO()) i=i;//printf("port 1 captured: %c\n", &x); else printf("%i could not capture port 1\n", i); Sleep(10); //ohne sleep hab ich n bisschen viele fehler }Die Idee ich aus 'm MSDN abgekupfert, wie unschwer zu erkennen ist... Das hat aber nicht auf anhieb geklappt daher das eigene "Gebastel".
Ziel ist es, das mir die Funktion bei jedem Aufruf das nächste Zeichen vom Port her liefert, so das ich win einer Endlosschlaufe in nem Thread andauernd den Input lesen und in ne Liste schreiben kann...
Ein besondere Dorn im Auge ist hier vor allem
GetOverlappedResult(hCom, &gOverlapped, &nBytesRead, TRUE), mit betonung auf das TRUE;
Kommen nächmlich keine Daten an, hängen wir!
Ich bitte dringenst um Hilfe, langsam hab' ich etwas Zeitdruck

Besten Dank
Euer Gast
-
du hast es dir schon selbst beantwortet

eben statt TRUE FALSE nehmen und dann noch auf ERROR_IO_INCOMPLETE reagieren.
guckst du: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getoverlappedresult.asp
-
net schrieb:
eben statt TRUE FALSE nehmen und dann noch auf ERROR_IO_INCOMPLETE reagieren.
Nun Ja...
Das hab ich mir selbst auch schon überlegt... aber wie reagiere ich am besten auf einen ERROR_IO_INCOMPLETE?
-
Der Gast schrieb:
Das hab ich mir selbst auch schon überlegt... aber wie reagiere ich am besten auf einen ERROR_IO_INCOMPLETE?
den entsprechenden case-zweig haste ja schon in deinem code drin. du könntest z.b. die funktion umbauen, dass die kein 'char' sondern ein 'int' zurückgibt und bei ERROR_IO_INCOMPLETE gibste einfach '-1' zurück (das sagt dem aufrufer dass nix empfangen wurde.
-
Hab ich schon Probier, allerding hab ich mir einfach "a"'s zugesendet und im besagten case dann "z" als rückgabewert der funktion gegeben:
case ERROR_IO_INCOMPLETE: { inBuffer='z'; return inBuffer; //printf("IO Incomplete\n"); //break; }Mit folgendem erfolg:
Fange ich mit dem Senden von Daten (mittels AccesPort) vor dem öffnen des Porten an, krieg ich nur "z"'s
Schicke ich die daten erst auf dem Port, wen ich am anderen ende mein "Program" bereits gestartet habe, also schon einige "z"'s enpfangen habe, schmiert mir das ganze ab und windows fragt mich, ob ich einen fehlerreport senden will...

Ich will nicht mehr zu viel Code posten, daher:
> Der ganze mist:
[url]http://free.pages.at/d_menet/cplusplus/main.cpp [/url]
-
Der Gast schrieb:
Schicke ich die daten erst auf dem Port, wen ich am anderen ende mein "Program" bereits gestartet habe, also schon einige "z"'s enpfangen habe, schmiert mir das ganze ab und windows fragt mich, ob ich einen fehlerreport senden will...

das ist aber ein anderes problem. da musste wohl mit'm debugger ran...