Wenn MainThread aus, alles aus?



  • Hey!

    Warum wird die Anwendung beendet, wenn ich Fenster 1 schließe? Wenn ich Fenster 2 schließe, bleibt Fenster 1 offen!

    Dazu noch eine Frage:
    Ist es üblich, pro Fenster einen Thread zu erstellen, wenn man mehrere Fenster (zB. wie bei GIMP) hat?
    Oder reicht eine GetMessage()-Schleife und zwei verschiedene WindowProc()s?

    #include <windows.h>
    #include <process.h>
    
    unsigned int __stdcall Thread2(void* param);
    long __stdcall WindowProcess(HWND windowHandle, unsigned message, WPARAM wParam, LPARAM lParam);
    long __stdcall WindowProcess2(HWND windowHandle, unsigned message, WPARAM wParam, LPARAM lParam);
    
    int __stdcall WinMain(HINSTANCE, HINSTANCE, char*, int)
    {
    	WNDCLASS windowClass = { };
    	windowClass.lpfnWndProc = WindowProcess;
    	windowClass.hCursor = LoadCursor(0, IDC_ARROW);
    	windowClass.lpszClassName = "Main";
    
    	RegisterClass(&windowClass);
    
    	CreateWindow("Main", "Window 1", WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX, 0, 0, 300, 300, 0, 0, 0, 0);
    
    	_beginthreadex(0, 0, Thread2, 0, 0, 0);
    
    	MSG message;
    	while(GetMessage(&message, 0 , 0, 0))
    	{
    		TranslateMessage(&message);
    		DispatchMessage(&message);
    	}
    }
    
    unsigned int __stdcall Thread2(void* param)
    {
    	WNDCLASS windowClass = { };
    	windowClass.lpfnWndProc = WindowProcess2;
    	windowClass.hCursor = LoadCursor(0, IDC_ARROW);
    	windowClass.lpszClassName = "Main2";
    
    	RegisterClass(&windowClass);
    
    	CreateWindow("Main2", "Window 2", WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX, 0, 0, 500, 500, 0, 0, 0, 0);
    
    	MSG message;
    	while(GetMessage(&message, 0 , 0, 0))
    	{
    		TranslateMessage(&message);
    		DispatchMessage(&message);
    	}
    
    	return 0;
    }
    
    long __stdcall WindowProcess(HWND windowHandle, unsigned message, WPARAM wParam, LPARAM lParam)
    {
    	switch(message)
    	{
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0;
    	}
    
    	return DefWindowProc(windowHandle, message, wParam, lParam);
    }
    
    long __stdcall WindowProcess2(HWND windowHandle, unsigned message, WPARAM wParam, LPARAM lParam)
    {
    	switch(message)
    	{
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0;
    	}
    
    	return DefWindowProc(windowHandle, message, wParam, lParam);
    }
    


  • Ein Thread reicht.
    Die CRT beendet die Applikation, wenn der Einstiegspunkt zurückkehrt (in diesem Fall WinMain).
    Das ist aber ein Feature der CRT und nicht von Windows:http://blog.kalmbachnet.de/?postid=65



  • Ahaa.
    Ein Thread reicht in jedem Fall? Auch wenn sich die Fenster unabhängig voneinander schließen lassen sollen? Nimmt man dann in WM_DESTROY das Handle des Fensters und löscht es mit DestroyWindow()?



  • KlausVorDemAus schrieb:

    Ahaa.
    Ein Thread reicht in jedem Fall?

    nur wenn du nicht zu lange in der wndproc des fensters verbleibst. windoofs benutzt eine art 'kooperatives multitasking' (DispatchMessage()) d.h. für jede message wird die wndproc des dazugehörigen fensterchens aufgerufen. hängt's irgendwo länger, dann sind alle fenster des threads eingefroren.
    🙂



  • Aha ok danke!


Anmelden zum Antworten