Multithread problem

Moin,

versuch mal ::postMessage((HWND)pParam,WM_YOURMESSAGE,WPARAM,LPARAM).
Du solltest beim starten des Threads natürlich das HWND deines Dialoges übergeben sonst wird das nichts.


Mfg
ToDu
 
Fangen wir mit dem Thread an:

Du übergibst ja schon einen Zeiger auf einen Parameter (&obj.a)
Ich weiß nicht, was in obj alles enthalten ist, sollte das handle Deines Fenster nicht enthalten sein füge es hinzu.
Bsp.
typdef struct
{
HWND hwnd;
......... // Deine anderen Paramter
.........

}OBJ, *POBJ;

Daraus erzeugst Du sicherlich irgendwo in Deinem Programm eine Variable diesen Types
z.B.
static OBJ obj;

Bevor Du den Thread erzeugst, initalisierst Du die Werte in diesem struct
Für das Handle also so:
obj.hwnd = hwnd;

Deinen Thread rufst Du nun auf mit:
AfxeginThread(Threadproc,&OBJ)

In Deinem Thread "Threadproc" legst Du nun z.B. einen Zeiger auf OBJ
also:
void Threadproc(PVOID pvoid)
{
POBJ obj;
obj = (POBJ)pvoid;
oder mit C++
pobj = static_cast<POBJ>(pvoid);
an.
Natürlich kannst Du auch eine Variable innerhalb Deines Threads des Types OBJ anlegen und die Werte mit den übergebenen Daten füllen. Hier hast Du ja diese Varibale statisch angelegt und "nur" einen Zeiger auf diese Varibale. Das hat allerdings den Vorteil, dass Dein Thread oder auch mehrere Threads diese Werte verändern können (natürlich durch entsprechende Synchronisationsmassnahmen) und Dein Hauptthread mit diesen veränderten Werten arbeiten kann.
Nun kannst Du auf das Handle mit obj->hwnd zugreifen und die Messages wie bereits erwähnt absenden:
PostMessage(obj->hwnd,WM_ADDMESSAGE,0,(LPARAM)s);
}

So nun zum Hauptprogramm, hier müssen nun noch eine USER MESSGAGES erzeugen
Dieses geht ganz einfach mit

#define WM_ADDMESSAGE WM_USER + 100

Da ich mich mit den MFC nicht mehr so gut auskenne, die WndProc in der klassischen Art. Die MFC bietet hier aber entsprechende Macros zur Erzeugung von Messagehandler an, die auf USER Defined Messages reagieren. Da müsstest Du mal in die Unterlagen schauen
In der WndProc kannst Du dann mit
LRESULT CALLBACK WndProc(HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case WM_ADDMESSAGE:
//Add (CString*)lparam in Deine MessageBox
return NULL;

case WM_.....
usw.
}
return DefWindowProc(hwnd,message,wParam,lParam);
}

Gruß
Gerhard
 

Neue Beiträge

Zurück