while Schleife in neuen Thread



  • Moin moin zusammen,

    ich arbeite gerade unter Qt und habe eine Run Funktion in der eine while Schleife läuft:

    int Application::Run()
    {
    	MSG msg = {};
    
    	theTimer->Initialize();
    
    	while( msg.message != WM_QUIT && m_bCloseApp != true )
    	{
    		if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
    		{
    			TranslateMessage( &msg );
    			DispatchMessage( &msg );
    		}
    		else
    		{
    			if( m_bPauseUpdate != true )
    			{
    				if(Update() != 0) break;
    			}
    			if( m_bPauseRender != true )
    			{
    				Render();
    			}
    			theTimer->Tick();
    		}
    	}
    
    	return ERR_SUCCESS;
    }
    

    Das Problem ist nun das diese Schleife Qt komplett blockiert. Ich habe versucht anhand von Tutorials diese Funktion sammt der while Schleife in einem neuen Thread laufen zu lassen, bekomme es aber einfach nicht gebacken.

    CEditor::CEditor(QWidget *parent)
    	: QMainWindow(parent)
    {
    	//.........
    
    	std::thread engineUpdate( &Application::Run, m_engine );
    	engineUpdate.join();
    }
    

    Im Moment wirft mit Visual Studio einen C2100 Error um die Ohren und egal wie es aussieht, entweder bekomme ich einen Error oder nach dem compilieren heißt es "Das Programm regiert nicht mehr". Weiß jemand woran es liegt bzw. was ich falsch mache?

    Gruß BlackArma



  • PeekMessage, TranslateMessage und DispatchMessage sind WinAPI und hätten von QT komplett weggekapselt worden sein sollen. Die Windows Messagequeue ist pro Thread, du kannst nur Nachrichten von Fenstern empfangen, die auch in diesem Thread geöffnet wurden.



  • Ja, das ist mir schon klar... Nachdem ich den Post verfasst hatte habe ich auch daran gedacht und den WinAPI Krahm entfernt, hat aber trotzdem nichts gebracht.
    Habs gerade in einer speraten Funktion stehen:

    void Application::RunEditor()
    {
    	theTimer->Initialize();
    
    	while( m_bCloseApp != true)
    	{
    		if( m_bPauseUpdate != true )
    		{
    			if(Update() != 0) break;
    		}
    		if( m_bPauseRender != true )
    		{
    			Render();
    		}
    		theTimer->Tick();
    	}
    }
    


  • Naja, was hast du dir denn bei dem engineUpdate.join(); gedacht?



  • std::thread::detach() suchst du.


Log in to reply