Multi-Threading / Anfängerfrage
-
Hallo,
ich versuche gerade meine Anwendung etwas zu beschleunigen - der PC soll eine Berechnung fortsetzen, während er auf neue Daten "von außen" wartet. Wollte deswegen mal eine Meinung zu folgendem Programmgerüst hören, da ich vorher noch nie Multithreading verwendet habe...es läuft, aber kann da vllt. was schiefgehen? ...außer, dass die DataExchangeClass nicht Thread-sicher ist?

#include <iostream> #include <Windows.h> using namespace std; DWORD WINAPI DataAcquisitionThread(LPVOID lpParam); class DataExchangeClass { public: // some objects }; int main() { DataExchangeClass Exchange; DWORD ThreadID; HANDLE hThread = CreateThread(0, 0, DataAcquisitionThread, &Exchange, 0, &ThreadID); if (hThread!=NULL) { cout << "Thread started.\n"; Sleep(2000); //replace with sophisticated calculation DWORD WaitResult = WaitForSingleObject(hThread, 5000); if (WaitResult==WAIT_TIMEOUT||WaitResult==WAIT_FAILED) { TerminateThread(hThread, 0); cout << "ERROR: Thread killed.\n"; } else cout << "Thread finished.\n"; if (CloseHandle(hThread)==0) { DWORD dw = GetLastError(); cout << "ERROR: Something went terribly wrong...Code " << dw << endl; } // <use new data> } else cout << "ERROR: Thread not started.\n"; cout << "Press [ENTER]..."; cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); cin.get(); return 0; } DWORD WINAPI DataAcquisitionThread(LPVOID lpParam) { DataExchangeClass &Exchange = *((DataExchangeClass*)lpParam); Sleep(2000); // replace with data acquisition return 0; }Danke!
-
Ansich sieht das ganz ok aus, jedoch würde ich dir empfehlen DataExchangeClass Exchange; erst IN dem Thread zu erstellen - bzw mit einer Kopie (memcpy()) der Datei zu Arbeiten. Damit hast du auch kein Problem, falls mehrer Threads darauf gleichzeitig zugreifen.
Außerdem verwundert mich Zeile 53:DataExchangeClass &Exchange = *((DataExchangeClass*)lpParam);müsste das nicht eigentlich so sein? Jedenfalls kenne ich deine Schreibweise nicht.
DataExchangeClass *Echange = (DataExchangeClass*)lpParam;
Edit:
Achso - ja dann will ich nichts gesagt haben
-
@Verim:
Wenn er pro Thread eine "DataExchangeClass" verwendet, dann kann er darüber wohl kaum Daten austauschen. Ich vermute dass genau das der Sinn der Klasse sein soll.Verim schrieb:
Außerdem verwundert mich Zeile 53:
DataExchangeClass &Exchange = *((DataExchangeClass*)lpParam);müsste das nicht eigentlich so sein? Jedenfalls kenne ich deine Schreibweise nicht.
DataExchangeClass *Echange = (DataExchangeClass*)lpParam;Das kommt hübsch auf's gleiche raus, nur dass er danach 1x ne Referenz und 1x nen Zeiger auf die "DataExchangeClass" Instanz hat.
-
@hustbaer: Irgendwie hatte ich gerade exakt die selben Gedanken, aber du warst schneller.

