int zu void *
-
Hallo
Warum benutzt du überhaupt eine TStringList? Ist denkbar ungeeignet.
Rein syntaktisch würde ich das so umstellen#include <vector> ... std::vector<HANDLE> Threads; Threads.push_back(_beginthreadex(NULL, 0, Warten,&Dateiname, 0, &ThreadID)); while (!Threads.empty()) { if (!TerminateProcess(Threads.back(),1)) break; Threads.pop_back(); }Natürlich must du die Behandlung für das Scheitern von TerminateProcess noch anpassen.
bis bald
akari
-
Das kann ich so nicht sagen. Gibt TerminateProcess true zurück? Wenn es false zurückgibt kannst du ja mit GetLastError mal prüfen was los ist.
-
Hmmmm nun meint er: [C++ Error] Unit1.cpp(86): E2034 Cannot convert 'unsigned long' to 'void *'
bei dieser Zeile:Threads.push_back(_beginthreadex(NULL, 0, Warten,&Dateiname, 0, &ThreadID));Obwohl der Rückgabewert von _beginthreadex ein Handle auf den gestarteten Thread sein soll!
-
Hallo
Das liegt daran das du hier Thread-Behandlung von Ansi-C und WinAPI mischt. Wenn du _beginthreadex verwenden willst dann hast du auch keine HANDLE sondern ein long das den Thread identifiziert. Dann must du aber auch _endthreadex verwenden, da kannst du auch den long-Wert übergeben (und den vector auf long umstellen).
Wenn du beim WinAPI-HANDLE bleiben willst must du auch die WinAPI-Funktion CreateThread verwenden, die liefert dir das benötigte HANDLE.Nicht zu vergessen das es eigentlich auch die VCL-Klasse TThread gibt die du eigentlich nehmen solltest.
bis bald
akari
-
Vielen Dank für die Antwort, doch mit der _endthreadex Funkion ist es nicht möglich den Thread zu schließen, also wenn er wie in meinem Fall in einer WaitForObject- Schleife ist wird dieser nicht geschlossen!
Was kann ich dagegen machen??MfG
TheCaleb
-
Hallo
Nocheinmal : du darfst die beiden Threadbehandlungen nicht durcheinanderbringen. Wenn du also ein long hast das für _endthreadex geeignet ist dann ist dieser Wert nicht für WaitFor... geeignet!
Um dir das ganze zu erleichtern solltest du besser aus TThread umsteigen.
bis bald
akari
-
Jo das weiß ich aber nochmal: Ich habe ein Thread mit _beginthreadex erstellt und mit _endthreadex möchte ich diesen nun beenden.
IN diesem Thread ist eine WaitFor... Funktion und wenn ich den Thread mit _endthreadex beenden möchte läuft dieser weiter...Im Thread: Warteschleife=WaitForSingleObject(OpenProcess(PROCESS_ALL_ACCESS,true,processID),INFINITE); Im eigentlichen Programm: while (!Threads.empty()) { _endthreadex(Threads.back()) Threads.pop_back(); }
-
Natürlich läuft der Thread weiter, schließlich wartet er auf das Event und nur auf dieses eine Event. Dies wäre allerdings mit allen Thread-Varianten so, ob er nun auf Win-API oder TThread wechselt ist dabei egal.
Mögliche Lösung: Nicht unendlich warten, sondern nur einen kurzen Zeitraum (wiederholt in einer Endlos-Schleife) und zwischenzeitlich prüfen ob der Thread beendet wurde und die Schleife dann verlassen.
-
...oder benutze "WaitforMultipleObjects" und benutze zum Beenden ein weiteres Event.

-
Vielen Dank, ich werde das dann gleich mal versuchen!
