problem mit threadverwaltung in klasse
-
hallo ihr.
folgender sachverhalt:
ich habe eine klasse geschrieben die threads verwalten soll (starten, stoppen, etc...)die beiden wichtigsten funktionen der CThreadControl sind:
// threadfunktion ausführen solange der thread lizensiert ist DWORD WINAPI CThreadControl::ThreadExecutor(LPVOID lpParameter) { while(bThreadIsLicenced == true) { this->dwThreadTarget(lpParameter); } return 0; } // ------------------------------------------------------------------------------ // neuen thread erstellen int CThreadControl::ThreadCreate(LPTHREAD_START_ROUTINE dwThreadTarget, LPVOID lpThreadTargetParameter) { // hThreadHandle = CreateThread(NULL, 0, dwThreadTarget, lpThreadTargetParameter, 0, lpThreadId); hThreadHandle = CreateThread(NULL, 0, ThreadExecutor, lpThreadTargetParameter, 0, lpThreadId); if(hThreadHandle != 0) { return 0; } else { iError = GetLastError(); return iError; } }
dabei sind die variablen folgende:
hThreadHandle = handle des threads in der klasse
dwThreadTarget = funktion die der thread ausführen soll
lpThreadTargetParameter = parameter der an die threadfunktion übergeben wirdder aufruf aus der main funktion ist dann wie folgt:
CThreadControl *myThreadPointer = new CThreadControl("TestThread", TestFunction1, 3, NULL, false); CThreadControl *myThread; myThread = myThreadPointer; myThread->ThreadSuspend(); myThread->ThreadSetPriority(1); myThread->ThreadResume(); ... myThread->~CThreadControl()
dabei sind:
"TestThread" = symbolischer name des threads
TestFunction1 = threadfunktion die ausgeführt werden soll (signatur: DWORD WINAPI TestFunction1(LPVOID lpParameter) )
3 = priorität des threads
NULL = keine parameter an die threadfunktion übergeben
false = thread nicht suspended startennun bekomme ich beim compilieren folgenden fehler in meiner ThreadControl klasse:
**error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__cdecl )(void )'wie behebe ich das? die ThreadExecutor funktion kann ja nicht static sein wenn ich den parameter ständig ändere oder?
danke schon jetzt für euere bemühungen.
root2
-
Ich hab zwar noch nie mit C++ unter Windows programmiert, geschweige denn mit MFC, würde aber mal versuchen, die Einstiegsfunktion für den Thread als static zu deklarieren.
Des weiteren sind Destruktoren in der Regel nicht da, um explizit aufgerufen zu werden. Wenn Du Dir den Speicher mit new holst, solltest Du ihn auch mit delete freigeben.
-
ThreadExecutor muss statis sein.
und nur so nebenbei CreateThread + C/C++ -> mit ziehmlicherheit speicherleck
-
Wird auch nur eine Funktion aus der Laufzeitbibliothek benoetigt, sollte man statt CreateThread() die C-Library-Funktion _beginthreadex() verwenden.
Ausserdem sollte man pruefen, ob die Verwendung der CThread-Klasse der MFC nicht angebrachter waere.
Des weiteren haben alle Thread-Create-Funktionen ein extra Parameterfeld, mit dem man z.B. einen Pointer auf ein Objekt uebergeben kann. Dadurch ist das Verwenden statischer Memberfunktionen kein Problem.