Thread mit WaitCommEvent blockiert WM
-
Hallo zusammen,
ich habe folgendes problem:
Ich habe ein programm das einen neuen Thread erstellt. in diesem Thread soll meine CAN-BUS Schnittstelle eigelesen werden. Um dies Interrupt gesteuert zu machen benutze ich in diesem Thread "WaitCommEvent". Dies Funktioniert auch ohne Probleme. Das Problem ist das jetzt eingehende Windowsnachrichten nicht mehr abgearbeitet werden wie z.B. WM_LBUTTONDOWN.Warum werden die Windows-Nachrichten nicht mehr abgearbeitet? Was kann ich dagegen tun?
Hier ist der Code:
#include "StdAfx.h" #include "CAN.h" DWORD WINAPI CanThread(LPVOID data); LRESULT CALLBACK MainWndProc (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam); bool initCanThread(); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { /*==================================================================== * desc: Erzeugt die Windowsoberfläche für das Applikationsprogramm *==================================================================*/ static TCHAR szAppName[]=TEXT("Touch"); WNDCLASS wc; MSG msg; HWND hWnd; // Register application main window class. wc.style = 0; // Window style wc.lpfnWndProc = MainWndProc; // Callback function wc.cbClsExtra = 0; // Extra class data wc.cbWndExtra = 0; // Extra window data wc.hInstance = hInstance; // Owner handle wc.hIcon = NULL, // Application icon wc.hCursor = NULL, //LoadCursor (NULL, IDC_ARROW); // Default cursor wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);//NULL; //no Background wc.lpszMenuName = NULL; // Menu name wc.lpszClassName = szAppName; // Window class name if (RegisterClass (&wc) == 0) return 0; // Fail code if not registered. // Create main window. hWnd = CreateWindow (szAppName, // Window class NULL, // Window title // Style flags WS_VISIBLE, // Nur Sichtbar, Keine Titelleiste 0, // x position 0, // y position GetSystemMetrics(SM_CXSCREEN), //Bildschirmbreite GetSystemMetrics(SM_CYSCREEN), //Bildschirmhöhe, NULL, // Parent NULL, // Menu, must be null hInstance, // Application instance NULL); // Pointer to create // parameters if (!IsWindow (hWnd)) return 0; // Fail code if not created // Standard show and update calls // Stellt das Fenster auf dem Bildschirm dar ShowWindow (hWnd, nCmdShow); //Teilt dem Fenster mit das es seinen Inhalt darstellen soll UpdateWindow (hWnd); while(GetMessage(&msg,NULL,0,0) /*holt eine Nachricht aus der Warteschlange*/) { //setzt Nachrichten um die Über die Tastatur erzeugt werden TranslateMessage (&msg); //sendet der Window-Prozedur Nachrichten DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK MainWndProc (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) { /*==================================================================== * desc: Bearbeiten der Windowsnachrichten *==================================================================*/ switch (wMsg) { //wird nach dem Starten des Programms, aber vor dem erstellen des //Fensters ausgeführt case WM_CREATE: //Initalisierungsroutinen aufrufen initCanThread(); return 0; case WM_PAINT: return 0; case WM_LBUTTONDOWN: return 0; //wird nachdem das Fenster geschlossen ist ausgeführt case WM_DESTROY: PostQuitMessage(0); //Setzt die Nachricht ENDE in die Warteschlange return 0; } //übernimmt das auswerten von Nachrichten die das Programm nicht selbst auswertet return DefWindowProc(hWnd,wMsg,wParam,lParam); } bool initCanThread() { /*==================================================================== * desc: Erzeugen des Threads in dem der CAN-BUS eingelesen wird *==================================================================*/ HANDLE hThread; DWORD dwThreadID; int index=1; hThread = CreateThread( NULL, 0, CanThread, (LPVOID)index, 0, &dwThreadID ); if (hThread==NULL) //Fehler beim erzeugen des Threads return false; if(!SetThreadPriority(hThread,THREAD_PRIORITY_NORMAL)) return false; return true; } DWORD WINAPI CanThread(LPVOID data) { CCAN ccan; //Klasse mit CAN-Bus Funktionen ccan.Init(_T("CID1:"),125000); //Initialisiernen des CAN-BUSes CANMSG msg; //CAN-Daten (Identifier, data-length und datenbytes while(true) //Endlosschleife { ccan.Read(&msg); /*Aufruf zum Warten auf CAN-nachrichten WaitCommEvent. Wenn nachrichten angekommen sind stehen diese in msg und der Thread soll wieder auf neue CAN Daten warten.*/ } }Das Programm ergibt noch keinen Sinn, da es die Daten die es vom CAN-BUS erhalten hat nicht auswertet, mir geht es aber nur darum warum die Windowsnachrichten nicht ausgeführt werden. Legt WaitComm event das ganze Programm lahm auch wenn es sich in einem anderen Thread befindet oder sperrt es mir die Nachrichten Warteschlange?
Gruß
spacehelix
-
Hallo zusammen,
das Problem hat sich erledigt. Die WM's werden empfangen. Es hat nur nicht funktioniert, da ich einen breakpoint an die stelle WaitCommEvent gesetzt hatte.
Gruß
spacehelix