Thread beendet sich (vorher: Programm hängt - Thread + WaitCommEvent)



  • Hi,

    ich habe folgendes Problem:

    ich lese Daten vom Comport und warte deshalb in einem Thread mittels WaitCommEvent auf die Startkennung der Daten. Unterdessen möchte ich aber noch Daten an den ComPort versenden.

    Doch beim Versenden hängt sich das komplette Programm auf. Ich schätze, dass WaitcommEvent Probleme macht wenn man auf etwas wartet und gleichzeitig senden will. Wie bekomme ich das dann trotzdem zum laufen?

    Oder liegt das daran dass die Comportsteuerung die ThreadKlasse ist?



  • habe inzwischen etwas gefunden, leider ist das für delphi und ich werde nicht sonderlich schlau draus:

    http://groups.google.com/group/de.comp.lang.delphi.misc/browse_thread/thread/2197c74a53ee93a9/d686f99e638fa36a
    sorry will keine schleichwerbung machen oder so aber vielleicht kann mir dadurch jemand weiter helfen.



  • Ok, ich habs jetzt hinbekommen, betreibe das ganze jetzt im Overlapped Modus, aber sobald ich etwas sende tritt mein Event nicht mehr ein. Muss ich das Event zum Warten auf ein Zeichen wieder zurück setzen?



  • Weiss niemand etwas über das Thema?

    p.s. Das Event tritt nicht mehr ein weil mein Thread sich terminiert, sobald ich etwas sende ....



  • Hallo

    Das Hauptproblem dürfte sein das WaitCommEvent eine WinAPI-Funktion ist. Ich werde dich mal ins richtige Forum verschieben, dort kann man dir vielleicht weiterhelfen.

    bis bald
    akari



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke für die Verschiebung!

    Naja im Moment arbeite ich ja mit "WaitComEvent" und "WaitForSingleObject", damit sollte es im Overlapped Modus doch möglich sein in einem Thread auf ein einkommendes Zeichen zu warten und gleichzeitig, über eine andere Funktion des Threads, Daten zu senden oder liege ich falsch?

    edit:

    Ich poste mal meinen Code dazu:

    void __fastcall Comport::Execute()
    {
    	waitflag = false;
    	DWORD dwRes;
    	DWORD dwEvtMask = NULL;
    	OVERLAPPED over = {0};
    	memset(&over, 0, sizeof(over));
    	over.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
    	while(!Terminated){
    		if (hComm != INVALID_HANDLE_VALUE){
    			if (waitflag) {
    				WaitCommEvent(hComm, &dwEvtMask, &over);
    				dwRes = WaitForSingleObject(over.hEvent, 1);
    				switch (dwRes){
    				case WAIT_OBJECT_0: //Event aufgetreten
    					// Message verarbeiten
    					if (dwEvtMask == EV_RXFLAG){
    						empfangen();
    						MainForm->display(readdata);
    					}
    				break;
    				case WAIT_TIMEOUT:
    					//timeout
    				break;
    				default:
    				CloseHandle(over.hEvent);
    				}
    			}
    		}
    	 }
    

    Senden Fkt:

    void Comport::senden(u8 * text,u8 lenght)
    {
    DWORD dwWritten;
    /// Befehl senden
    OVERLAPPED ovwrite = {0};
    ovwrite.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
    WriteFile(hComm, text, lenght , &dwWritten , &ovwrite);
    }
    

    Ich hab die senden Fkt auch schon ausgelagert, in den Main Thread, das hilft aber nichts 😕



  • niemand ne Idee? Oder einen Vorschlag wie ich das komplett anders machen könnte?



  • ich hab deinen thread nicht gelesen aber vielleicht kannst du mal diese library ausprobieren: http://www.codeproject.com/system/serial.asp


Anmelden zum Antworten