Struct an Thread übergeben | AfxBeginThread
-
Hallo,
hier mein Code:const int THREAD_COUNT = my_data.size(); HANDLE *hThreads = new HANDLE[THREAD_COUNT]; my_worker_data passData; passData.pParam = this; for(i=0; i<THREAD_COUNT; i++) { passData.tmpEvent = my_data[i]; passData.i = i; CWinThread *pThread = ::AfxBeginThread(single_event_worker, &passData); hThreads[i] = pThread->m_hThread; } ::WaitForMultipleObjects(THREAD_COUNT,hThreads,TRUE,60000); delete[] hThreads; hThreads = NULL; UINT CTestAPPDlg::single_event_worker(LPVOID pass) { my_worker_data* passData = (my_worker_data*) pass; CTestAPPDlg* pDlg = (CTestAPPDlg*) passData->pParam; pDlg->get_details(passData->tmpEvent); return 1; }Das Programm soll viele Anfragen parallel bearbeiten und schmiert wegen diesem Teil ab. Ich denke, dass es an dem Pointer liegt, denn während ein neuer Thread die Daten von der Variable abfragen will, kann es ja passieren, dass die parent-Funktion schon wieder die Daten geändert hat.
Wie krieg ich das sauber gelöst?
Habs schon mit nem Array für die ganzen my_worker_data's versucht aber das hat auch nicht geklappt.
Grüße,
Mikael
-
Was willst du machen, mit den Thread parallel daten im Dialog anzeigen??
dAs ist nich gut...
mach einen Timer in deinem Dialog, welcher in einem best. Intervall deine Daten im Fenster aktualisiert, diesen sycronisierst du mit deinen Threade, welche irgendwas mit deinen daten machen!!
OnTimer(){ //LOCK // Daten lesen und anzeigen //UNLOCK } ThreadFunc(....){ //LOCK daten berechnen // UNLOCK }
-
Nein, darum geht es nicht.
Das Programm soll parallel über Curl mehrere HTTP/s-Requests senden.Dafür muss ich der Threadfunktion den this-Pointer übergeben und die Url der Seite die abfragt werden soll.
Grüße,
mikael
-
Du übergibst allen erstellten Threads die Adresse des selben struct's, also arbeiten auch alle mit den selben Daten. Zur Lösung brauchst du erstens ein Array von my_worker_data-Objekten (für jeden Thread ein eigenes) und zweitens Zugriffssynchronisation (Critical Section o.ä.) wenn du mit den Dialog-Daten arbeiten willst.
(Randfrage: Was genau machen die Threads eigentlich mit deinem this-Objekt?)
-
Ich konnte den this-Zeiger weglassen und zusammen mit dem vorgeschlagenen Array ging es dann. Hab es schon gestern hinbekommen aber vergessen zu schreiben.
Danke!