<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Thread mit WaitCommEvent blockiert WM]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgendes problem:<br />
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 &quot;WaitCommEvent&quot;. Dies Funktioniert auch ohne Probleme. Das Problem ist das jetzt eingehende Windowsnachrichten nicht mehr abgearbeitet werden wie z.B. WM_LBUTTONDOWN.</p>
<p>Warum werden die Windows-Nachrichten nicht mehr abgearbeitet? Was kann ich dagegen tun?</p>
<p>Hier ist der Code:</p>
<pre><code class="language-cpp">#include &quot;StdAfx.h&quot;
#include &quot;CAN.h&quot;

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(&quot;Touch&quot;);
 	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 (&amp;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(&amp;msg,NULL,0,0) /*holt eine Nachricht aus der Warteschlange*/)
	{
		//setzt Nachrichten um die Über die Tastatur erzeugt werden
		TranslateMessage (&amp;msg); 

		//sendet der Window-Prozedur Nachrichten
		DispatchMessage(&amp;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, 
                            &amp;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(&quot;CID1:&quot;),125000); //Initialisiernen des CAN-BUSes	

CANMSG msg; //CAN-Daten (Identifier, data-length und datenbytes

	while(true) //Endlosschleife
	{	

		ccan.Read(&amp;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.*/
	}
}
</code></pre>
<p>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?</p>
<p>Gruß<br />
spacehelix</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/157990/thread-mit-waitcommevent-blockiert-wm</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 13:14:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/157990.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 31 Aug 2006 12:05:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Thread mit WaitCommEvent blockiert WM on Thu, 31 Aug 2006 12:05:31 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgendes problem:<br />
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 &quot;WaitCommEvent&quot;. Dies Funktioniert auch ohne Probleme. Das Problem ist das jetzt eingehende Windowsnachrichten nicht mehr abgearbeitet werden wie z.B. WM_LBUTTONDOWN.</p>
<p>Warum werden die Windows-Nachrichten nicht mehr abgearbeitet? Was kann ich dagegen tun?</p>
<p>Hier ist der Code:</p>
<pre><code class="language-cpp">#include &quot;StdAfx.h&quot;
#include &quot;CAN.h&quot;

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(&quot;Touch&quot;);
 	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 (&amp;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(&amp;msg,NULL,0,0) /*holt eine Nachricht aus der Warteschlange*/)
	{
		//setzt Nachrichten um die Über die Tastatur erzeugt werden
		TranslateMessage (&amp;msg); 

		//sendet der Window-Prozedur Nachrichten
		DispatchMessage(&amp;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, 
                            &amp;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(&quot;CID1:&quot;),125000); //Initialisiernen des CAN-BUSes	

CANMSG msg; //CAN-Daten (Identifier, data-length und datenbytes

	while(true) //Endlosschleife
	{	

		ccan.Read(&amp;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.*/
	}
}
</code></pre>
<p>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?</p>
<p>Gruß<br />
spacehelix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128326</guid><dc:creator><![CDATA[spacehelix]]></dc:creator><pubDate>Thu, 31 Aug 2006 12:05:31 GMT</pubDate></item><item><title><![CDATA[Reply to Thread mit WaitCommEvent blockiert WM on Mon, 04 Sep 2006 10:30:02 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>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.</p>
<p>Gruß<br />
spacehelix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1130656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1130656</guid><dc:creator><![CDATA[spacehelix]]></dc:creator><pubDate>Mon, 04 Sep 2006 10:30:02 GMT</pubDate></item></channel></rss>