Problem mit Threads!
-
Hi Forum,
hab Problem mit Threads, und zwar jedes mal wenn ich aus einem Thread in ein CListCtrl Control schreiben will, also Daten ausgeben will, aus einer Thread Funktion rufe ich eine Function auf, die die Daten anzeigen soll, das Programm bleibt an der Stelle stehen :int iItemNummer; iItemNummer = pList->GetItemCount(); // hier kommt der nicht weiter!! pList->InsertItem(iItemNummer, csItemData);mit ::SendMessage(...); gehts, aber wie kann ich sonst auser mit ::SendMessage(...); aus einem Thread auf ein Control zugerifen und Daten ausgeben, das Programm erzeugt mehrere Threads die dann jeder für sich seine Daten anzeigen soll und alle in das selbe Control !?

danke
pixel
-
Hi,
bei mir funktioniert sowas ähnliches. Ich habe einen globalen Zeiger auf die Liste. Es ist wichtig, daß der Zeiger im Hauptthread des Programms initialisiert wird.
Ob das die Lösung für Dich ist, kann ich aber nicht versprechen.
Grüße
Echo
-
pixel schrieb:
wie kann ich sonst auser mit ::SendMessage(...); aus einem Thread auf ein Control zugerifen
Mit PostMessage. Bei MFC darfst du Methoden einer Fensterklasse nur aus dem Thread aufrufen, der das Fenster erstellt hat.
-
pixel schrieb:
Hi Forum,
.... aber wie kann ich sonst auser mit ::SendMessage(...); aus einem Thread auf ein Control zugerifen und Daten ausgeben, das Programm erzeugt mehrere Threads die dann jeder für sich seine Daten anzeigen soll und alle in das selbe Control !?

danke
pixeldu übergibst beim Starten des Threads den Zeiger des Dialoges bzw. des Controlls.
AfxBeginThread(myThreadFunc, this);Im Threadcode castest du dann den void* Parameter auf den Dialog, somit kannst du auf alle Public-Elemente zugreiffen..
UINT myThreadFunc(LPVOID param){ MyDialog* pDlg = (MyDialog*) param; pDlg->m_List.DoSomething(....); return 0; }.. oder du übergibst anstatt then this Zeiger nur den Zeiger des entsprechenden Elementes.
-
Hallo,
danke für eure Tipps, ich hab das mit der globalen Variablen gemacht, aber das mit dem pointer auf den Dialog finde ich super!mfg
pixel
-
MFK schrieb:
pixel schrieb:
wie kann ich sonst auser mit ::SendMessage(...); aus einem Thread auf ein Control zugerifen
Mit PostMessage. Bei MFC darfst du Methoden einer Fensterklasse nur aus dem Thread aufrufen, der das Fenster erstellt hat.
Das ist nicht richtig.
Erstellt man eine von CWinThread abgeleitetet Klasse und übergibt den this an den Thread kann man von Thread auf die Steuerelemente zugreifen.
Auch auf ListCtrl.
Ich hatte sogar mal ein Programm wo 60 Threads in das ListCtrl geschrieben haben.
-
Ich weiß, dass das in vielen Fällen funktioniert. Wenn die MFC-Methode nur ein dünner Wrapper um einen SendMessage-Aufruf ist, klappt das hervorragend.
Microsoft Systems Journal schrieb:
[...] you can't pass a CWnd object from one thread to another, and MFC advises against it. Sometimes it will work, but in general it fails because, among other things, the AssertValid function for CWnds checks that the CWnd object exists in the (temporary or permanent) handle map associated with the same HWND as m_hWnd. But the CWnd only exists in the thread where it was created, or the thread from which CWnd::FromHandle was called in the case of a temporary object. That CWnd will not exist in the handle map of any other thread, and if you pass it to another thread, the code is sure to crash as soon as it runs into one of the zillions of ASSERT_VALID checks sprinkled throughout MFC.