009
05.10.2004, 15:36 Uhr
proga
|
hörmal, dieses Rumspringen kann ich mir nicht vorstellen, sowas macht ein Thread nicht. Dieser Effekt ist die folge deiner Schleife in der Methode ProcessSeparatingThread. Da rufst du die Methode ProcessSeparating auf, solange das Flag gesetzt ist. Vielleicht hast du dich vertan und meintest eine If-Abfrage ???!
C++: |
while(pDlg->m_Flag == 1) // diese Bedingung hat deinen "Sprung-Effekt" zur Folge { pDlg->ProcessSeparating(); }
|
zu SetWindowText:
ich glaube, da hast du was falsch verstanden. Du musst nicht die Methode SetWindowText der Klasse CWnd aufrufen, sondern die API-Funktion SetWindowText. Dieser übergibst du ein Handle deines Steuerelements.
Und nun ein zu Threads allgemein: Grundsätzlich ist es gefährlich, MFC-Objekte threadübergreifend zu nutzen, da du nicht davon ausgehen kannst, dass das Objekt immer vorhanden ist (Diese Regel gilt nicht für Objekte, die direkt von CObject abgeleitet sind oder von einfachen Klassen wie CRect oder CString). Stattdessen sollte man mit dem Hauptthread über Messages kommunizieren. Dazu muss der Arbeitsthread ein Handle auf das Objekt haben.
Also, z.B.
du hast eine Klasse CMyDlg und eine Methode MyThreadProc, die static deklariert ist
Du startest den Thread mit AfxBeginThread und übergibst diesem ein Handle für dein Dialog-Objekt. Dann kannst du Message verschicken:
C++: |
// in einer Methode der Dialogklasse AfxBeginThread(MyThreadProc, GetSafeHwnd());
// in der Threadfunktion ::PostMessage((HWND) pParam, WM_MYMESSAGE, 0, 0);
|
Du musst natürlich auf diese Message auch reagieren, also schreibst du dafür einen Messagehandler. Dieser Post wurde am 05.10.2004 um 15:39 Uhr von proga editiert. |