Frage zu Threads
-
Jochen Kalmbach schrieb:
Ascharan schrieb:
unter dessen wie frage ich aus ich aus meinem Programm ab das er fertig is , hab schon mit
[cpp] WaitForSingleObject(RecieveThread , INFINITE); [/cpp]versucht wie ,da bleibt aber mein programm hängen
Dan hat sich der Thread eben noch nicht beendet...
laut debugger aber doch hier
Der Thread 'Win32 Thread' (0x144) hat mit Code 0 (0x0) geendet.
-
Dann war das eben ein anderer... oder hast Du verifiziert, dass die ThreadID stimmt?
Hast Du überhaupt das richtige Handle?
-
Hab doch in meinem Programm nur einen Thread wie kann man da das falsche Handle bzw. die Falsche ID Übergeben

-
Du hast mindestens zwei Threads in deinem Programm - in einem läuft dein Hauptprogramm, den zweiten hast du mit CreateThread angelegt. Weitere können unterwegs auch noch entstehen, wenn sie irgendwo hinter den Kulissen von Windows gebraucht werden (und die informieren dich dann genauso darüber, daß sie beendet wurden).
-
Wo is da der erste thread (die WinMain) oder ?
-
Ja, der erste Thread beginnt normalerweise mit der main()/WinMain() (das ist der Thread, den das WaitForSingleObject() ruhiggestellt hat).
-
aso nur hab ich auf den Zweiten thread verwiesen
WaitForSingleObject(RecieveThread , INFINITE);hab ja mit
HANDLE RecieveThread ;Das Handle erzeugt also sollte er ja eigentlich auf den thread zeigen den ich gestartet hab oder

-
Wenn du den Inhalt der Variablen nicht überschrieben hast, müsste dort noch die ID deines zweiten Threads drin stehen. Aber vermutlich war das nicht der "'Win32 Thread' (0x144)", der in den Trace-Ausgaben als beendet gemeldet wurde.
-
hm weis net, threads sind schwerer als ich dachte

-
also wenn ich mein debugger gestartet hab hab ich darauf geachtet, wenn ich meinen thread starte hat er das im debugger gezeigt und zwar nachdem der download fertig war zeigte er Der Win32 Thread ... hat mit 0 geendet (0x0)also ich schätze schon das er den thread beendet hat den ich Mit CreateThread Gestartet hab .
des weiteren wie kann ich den thread erneut ausführen so wie ich es bisher gemacht habe muss ich meine anwendung beenden und neustarten um den thread erneut aufzurufen
-
Zeig mal mehr Code. Wie ist 'RecieveThread' definiert ? Fehlt dort evtl. das Schlüsselwort 'static' ?
PS: Vergiss das CloseHandle nicht!
-
Ascharan schrieb:
des weiteren wie kann ich den thread erneut ausführen so wie ich es bisher gemacht habe muss ich meine anwendung beenden und neustarten um den thread erneut aufzurufen
Soweit es sich um eine Singlethread Anwendung handelt muss der Thread beendet und das Handle geschlossen werden, bevor du den Thread erneut erzeugst.
Aber nun mal die Frage, wo befindet sich der Funktionsaufruf
WaitForSingleObject(RecieveThread , INFINITE);Wird er im Thread selber aufgerufen (also fragt sich der Thread selber ab, ob er sich beendet hat), oder im Code welcher den Thread startet (würde den Code ja auch blockieren, welches sicher nicht Sinn und Zweck eines Threads ist).
Warum definiertst du dir nicht eine benutzerdefinierte Message, die beim Beenden den Downloads an den aufrufenden Code gesendet wird. Damit weis das eigentliche Prog dann, das der Thread 'geschlossen' werden kann.
-
Analog Bit schrieb:
Ascharan schrieb:
des weiteren wie kann ich den thread erneut ausführen so wie ich es bisher gemacht habe muss ich meine anwendung beenden und neustarten um den thread erneut aufzurufen
Soweit es sich um eine Singlethread Anwendung handelt muss der Thread beendet und das Handle geschlossen werden, bevor du den Thread erneut erzeugst.
Hm ist IMHO kein Muss, wohl aber ratsam
.Wäre sowieso mal interessant zu wissen, ob Du die CTL auf Multithreaded umgestellt hast
.
-
In einer single threaded Anwendung verwendet man garkeine Threads die man selbst anlegt.
Sobald man selsbt einen Thread anlegt ist die Anwendung also nichtmehr single threaded, und wenn man das Projekt trotzdem als single threaded eingestellt hat ist es ein Fehler.
Das Schliessen des Handles ist dabei überhaupt nicht von Belang. Davon abgesehen sollte man es natürlich machen, einfach schon weil es zum guten Stil gehört.
-
ahm hä hab den überblick verloren sollte öffter vorbeischauen das Mit dem CTL hab ich noch net verstanden ich zeig morgen n bissle code bin zu müde bin grad erst nachhaus gekommen biss morgen äh heute mittag

-
also hier der code:
[cpp] //Thread ID unsigned long iID = 0; //Thread Handle HANDLE RecieveThread = NULL; // Thread Struct typedef struct _MyDownloadData { HWND hwndProgress; HWND hwndStaticText; CHAR *szUrl; CHAR *szFileName; } MyDownloadData, *PMyDownloadData; DWORD dwExitCode = 0; // Thread-ID DWORD WINAPI MyDownloadThread(LPVOID lpParameter) { PMyDownloadData myData=(PMyDownloadData)lpParameter; // Deine InternetDownloadFile aufrufen: InternetDownloadFile (myData->hwndProgress,myData->hwndStaticText,myData->szUrl, myData->szFileName); // Thread hat fertig: ExitThread(0); } //... MyDownloadData threadData; threadData.hwndProgress=progress; threadData.hwndStaticText=stext; threadData.szUrl=buffer_a; threadData.szFileName=buffer_b; RecieveThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyDownloadThread,&threadData,0,&iID ); WaitForSingleObject(RecieveThread, INFINITE); CloseHandle( RecieveThread ); [/cpp]mit CTL meinst du Certified Thread Library oder ?
-
Also ExitThread würde ich einmal weglassen, du konntest auch einfach return 0 dafür schreiben. Und dass du gleich nach der erstellung des threads auf ihn wartest macht dsen thread eigentlich unnötig. Wenn du window messages etc. währenddessen empfangen willst dann mach doch eine message schleife rein, oder benutz (MsgWaitForMultipleObjects).
-
Könnt ihr mir noch gute Literatur Empfehlen hab mir heut das buch von Olaf Neuendorf -> Windows Multithreading mit C++ & C# gekauft konnte net dran vorbeilaufen
vorallem da ich bei diesem thema grad bin , da muss ich mich aber erst durchlesen den ersten überblick aber is das ein ziehmlich Complexes thema
lol
-
Sorry, meine natürlich CRT (= C-Run-Time).
-
CodeFinder schrieb:
...
Wäre sowieso mal interessant zu wissen, ob Du die CTL auf Multithreaded umgestellt hast
.CodeFinder schrieb:
Sorry, meine natürlich CRT (= C-Run-Time).
ähm nö :D, wo mach ich das
?