UpdateData() im Thread
-
Hallo,
ich habe mir einen Thread zusammengebastelt. Alles funzt prima, außer das mit dem UpdateData().
Wie kann ich meine Steuerelemente aus dem Thread heraus aktualisieren?Gruß
coffee
-
SetDlgItemText
-
Kann jemand erklären, warum es mit UpdateData(...) im Thread zu Problemen (Debug-Modus, assertion-Meldung) kommt? Wie sieht das ideale go-around aus?
-
Funktioniert nicht im Thread.
Abhilfe: Wie thomas80d beschrieben hat alle Steuerelemente einzeln aktualisieren.
Oder eine Nachricht an das Fenster senden
-
Soll es dafür überhaupt einen Workaround geben?
Ich meine man stelle sich folgendes vor:
2 Autos (bildlich für die 2 Threads) fahren nebeneinander auf der Autobahn. Der rechte Fahrer kurbelt die Scheibe runter und sagt dem Beifahrer des linken Autos, er solle doch mal schnell sein Lenkrad übernehmen, weil er mal telefonieren muss.
Da sehen wir: Jeder Thread ist für sein(e) Fenster verantwortlich.Das Beispiel in der MSDN, bei dem mehrere Threads auf das GDI eines Fensters zugreifen, ist auch eher unpraktisch, denn das Updaten der Threadobjekte wird in OnPaint nicht vorgenommen, so dass ein Invalidieren von ausserhalb das an der Stelle vorhandene Zeichenobjekt unwiderruflich löscht. Okay, es ist schneller, als jedesmal
parentWnd->InvalidateRect( myOldRect, TRUE);
parentWnd->InvalidateRect( myNewRect, FALSE);
aufzurufen, wobei OnPaint dann durch alle Zeichenobjekte iterieren muss. Habe aber noch keine bessere Möglichkeit gefunden.
-
Woher weiß man eigentlich, welche Funktionen (z.B. von CWnd) in diesem Sinne (Thread B greift via Pointer auf ein CWnd-Objekt von Thread A zu) "threadsicher" sind? Das Musterbeispiel ist ja GetParent() und GetParentFrame(). Gibt es irgendwo eine Auflistung dieser Funktionen (geht/geht nicht)?
[ Dieser Beitrag wurde am 21.03.2003 um 17:34 Uhr von Erhard Henkes editiert. ]
-
Ich denke, man kann sich folgendes merken:
Wenn die Funktion auf einer Message bzw. Messages basiert, geht's auf alle Fälle ;), basierend auf API dürfte es auch keine Probleme geben.void MyThread( LPVOID pParam)
{
CWnd* pWnd = (CWnd*)pParam;
pWnd->SetWindowText( "abc"); // basierend auf Message WM_SETTEXT
pWnd->GetParent(); // basierend auf API GetParent()
}