GetMessage/PeekMessage als Thread



  • Ich fand es halt nervig, wenn man immer wieder GetMessage() oder PeekMessage aufrufen muss...
    Deshalb dachte ich, man könnte doch einen Thread starten der das einfach alle 10ms für einem tut. Allerdings funktioniert es nicht und ich weiss nicht wirklich wieso?

    P.S.: Es handelt sich um eine Konsolenanwendung.

    #include <windows.h>
    #include <iostream>
    
    HWND hWnd;
    MSG msg;
    
    LRESULT CALLBACK WndProc(HWND _hWnd,UINT _msg,WPARAM _wParam,LPARAM _lParam)
    {
    	return DefWindowProc(_hWnd,_msg,_wParam,_lParam);
    }
    
    DWORD WINAPI MessageThread(LPVOID _d)
    {
    	while(1)
    	{
    		if(PeekMessage(&msg,hWnd,0,0,PM_REMOVE))
    		{
    				TranslateMessage(&msg);
    				DispatchMessage(&msg);
    		}
    		Sleep(10);
    	}
    	return 0;
    }
    
    void FensterErstellen(void)
    {
    
    	WNDCLASS wc={
    		CS_HREDRAW|CS_VREDRAW,
    		WndProc,
    		0,
    		0,
    		(HINSTANCE)GetModuleHandle(NULL),
    		LoadIcon(NULL,IDI_APPLICATION),
    		LoadCursor(NULL,IDC_ARROW),
    		(HBRUSH)GetStockObject(WHITE_BRUSH),
    		NULL,
    		TEXT("CM-LCD")
    	};
    
    	RegisterClass(&wc);
    
    	hWnd=CreateWindow(
    		TEXT("CM-LCD"),
    		TEXT("CM-LCD"),
    		WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		NULL,
    		NULL,
    		(HINSTANCE)GetModuleHandle(NULL),
    		NULL
    	);
    
    	ShowWindow(hWnd,SW_SHOWNORMAL);
    	UpdateWindow(hWnd);
    
    	CreateThread(0,0,MessageThread,NULL,0,NULL);
    }
    
    int main(void)
    {
    	FensterErstellen();
    	while(1)
    		Sleep(1000);
    }
    

  • Mod

    Weil ein Fenster im Kontext eines Threads ausgeführt und gehostet wird. Das heißt wenn Du in einem Thread GetMessage ausführst, dann erhältst Du nur nachrichten für Fenster, die auch in diesem Thread erzeugt wurden.

    Da Dein Thread kein Fenster erzeugt, wird auch keine Nachricht ausgeführt und empfangen...



  • Danke Maestro!
    Ich muss also die Erstellung des Fensters einfach auch in den Thread packen und es geht...



  • Jetzt ist mein nächstes Problem, das die Callback-Routine, als statische Methode, ja keinen This-Zeiger hat. Ich habe schon recht ausgiebig gesucht, aber es will auch hier einfach nicht funktionieren.

    So sieht das momentan aus:

    LRESULT CALLBACK window::windowprocedure(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
    {
    	if(msg==WM_CREATE)
    		SetWindowLong(hwnd,GWL_USERDATA,(LONG)lparam);
    	window *pthis=(window *)GetWindowLong(hwnd,GWL_USERDATA); //(Die Klasse heisst "window".)
    	return 0;
    }
    

  • Mod

    1. Was hast Du nun davon, dass Du einen Thread mit einem Fenster hast...? Du hättest das gaze auch ohne Thread mchen können 😉
    2. Es gibt 1000 Ansätze.
    Ich würde die ATL verwenden... oder die MFC, je nachdem was verlangt wird und keinen Klassen-Konstrukt selber bauen. Nicht zu vergessen WTL
    3. Das Du gesucht hast, bezweifle ich etwas. Wenn Du in diesem Forum nach GWL_USERDATA, findest Du genug Diskussionen um dieses Thema. Was ist Dein Problem?


Log in to reply