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


Anmelden zum Antworten