MultiThread-UpdateAllViews()-Konstruktion verhindert Aktualisierung der Toolbar



  • Hab mir mit Hilfe aus diesem Forum so eine Konstruktion gemacht, damit UpdateAllViews() noch funktioniert...

    m_isRunning=1;
    	const int cObjects = 1; 
    	HANDLE phObjects[cObjects]; 
    	phObjects[0] = (HANDLE)event; 
    	AfxBeginThread(Start,this);
    	while (m_isRunning) 
    	{ 
    		DWORD result ;  
    		MSG msg ;  
    		while( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))  
    		{  
    			if (msg.message == WM_QUIT) {
    			  ::PostQuitMessage(0);
    				return;  
    			}
    		  DispatchMessage(&msg);  
    		}
    		result = MsgWaitForMultipleObjects( cObjects, phObjects, FALSE, INFINITE, QS_ALLINPUT);  
    		if (result == (WAIT_OBJECT_0 + cObjects)) 
    		{ 
    		  continue; 
    		}  
    		else  
    		{  
    		  UpdateAllViews(NULL); 
    		}
    	}
    

    Leider funzt jetzt das Aktivieren/Deaktivieren des Start- bzw. Stopbuttons in der Toolbar nich mehr...scheinbar reicht DispatchMessage(&msg) nicht...was muss ich noch machen?



  • Hab der Thread-Funktion eine Struktur mit der Handle des Views übergeben und die WM_PAINT Nachricht dann manuell gepostet.
    (HWND s->p = CView::GetSafeHwnd())

    CFlitzDoc* pDoc = (CFlitzDoc*) s->p;
    CFlitzView* pView = (CFlitzView*)CWnd::FromHandle(s->hw);
    pView->InvalidateRect(NULL,FALSE);
    ::PostMessage(s->hw,WM_PAINT,NULL,NULL);
    


  • a) WM_PAINT sollte niemals direkt an ein Fenster geschickt werden. Invalidate reicht da aus.
    b) MFC ist sehr threading-Unfreundlich. Wenn irgend möglich, solltest du:
    - auf UI-Threads (wenn überhaupt) auf Dialoge u.ä beschränken
    - das ganze Doc/View - Handling der Views im Main Thread lassen
    erspart 'ne Menge Kopfschmerzen.

    Versteh ich deine Thread-Architektur richtig:
    Der Main Thread startet einen Worker Thread, und geht in eine lokale message Loop, die außerdem auf ein Event wartet. Das Event scheint nur ein UpdateAllViews auszulösen.

    Warum sparst du dir nicht die lokale Message Loop, und löst das UpdateAlViews über ein MainFrame->PostMessage(<application defined message>) aus?
    Wäre m.E. sauberer


Anmelden zum Antworten