Frage zu Threads
-
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
?
-
Welcher Compiler (IDE) ?
Bei VC++ 2005:
Projekt->Eigenschaften->Konfigurationseigenschaften->C/C++->Codegenerierung->Laufzeitbibliothek->Multithreaded (/MT)
-
Beim 2005er VC gibt *nurmehr* multithreaded... wird er sich also schwer tun etwas anderes als multithreaded (debug) (dll) eingestellt zu haben.
-
Sry Für die Späte Antwort: jap hab VC++ 2005
-
Hi,
ich hab mir eine Anwendung programmiert, in der das Programm auf einen Thread warten soll, der im Grunde genommen so lange schläft, bis eine bestimmte File an einem bestimmten Ort existiert.
Bis die File erzeugt wird vergeht knapp ne Minute(auch wenns unwichtig ist)
Mein bisheriger Code sieht so aus:
///////////////FileExists
DWORD WINAPI FileExists(LPCWSTR filename)
{
//Wenn File nicht vorhanden
if (GetFileAttributes(filename) == -1 )
{
return 0;
}
else
{
return 1;
}
}//////////THREAD
DWORD WINAPI Thread(LPVOID param)
{
while (FileExists(_T("bla.txt")) == 0)
{
Sleep(1000);
}return 0;
}/////////int_main
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
//Thread erzeugen
HANDLE threadHandle = CreateThread(0,0,Thread,0,0,&threadID);//auf dessen beendigung warten
WaitForSingleObject(Thread, INFINITE);////REST
}Leider wartet mein Programm nicht auf die Beendigung des Threads und schließt sich kurz nach Aufrufs des Threads

Könnt ihr mir vielleicht sagen, was ich falsch gemach hab?
Gruß
Nightmare
-
"WaitForSingleObject ()" braucht ein Threadhandle als Parameter :
... HANDLE threadHandle = CreateThread(0,0,Thread,0,0,&threadID); ... // WaitForSingleObject(Thread, INFINITE); WaitForSingleObject(threadHandle, INFINITE); ...
-
Kanns leider erst Morgen probieren, werd mich dann aber noch mal melden
Vielen Dank erstmal
EDIT: Alles Klar das klappt bestens! Vielen Dank nochmal

Gruß
Nightmare
-
Ich hab nochmal ne Frage:
Und zwar will ich nun ne CAB-File mit Hilfe von ShellExecuteEx installieren.
Meine Anwendung soll so lange nichts tun, bis die CAB-File vollständig installiert wurde.Habt ihr irgendeinen Tipp, wie ich dieses Problem am besten lösen könnte?
Gruß
Nightmare
-
ShellExecuteEx () liefert bei erfolgreicher Ausführung ein Handle vom gestarteten Prozess in der SHELLEXECUTEINFO-Struktur (Member hProcess).
Der lässt sich auch mit WaitForSingleObject () nutzen, i.e. so :SHELLEXECUTEINFO shinf; ... ShellExecuteEx (&shinf); WaitForSingleObject ( shinf.hProcess,INFINITE); ...
-
OK, das hilft mir ja schon mal weiter.
Aber wie finde ich heraus, wann der Prozess(spricht mein CAB) vollständig beendet ist?
Ich hab folgendes vor:
DWORD WINAPI Install
{
SHELLEXECUTEINFO ShellInfo;ShellInfo.cbSize = sizeof(ShellInfo);
ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShellInfo.hwnd = NULL;
ShellInfo.lpVerb = _T("open");
ShellInfo.lpFile = _T("MeineCAB");
ShellInfo.lpParameters = _T("");
ShellInfo.lpDirectory = _T("");
ShellInfo.nShow = SW_SHOW;
ShellInfo.hInstApp = NULL;// CAB ausführen
ShellExecuteEx(&ShellInfo);while(///CAB installiert wird///)
{
///schlafe///
}
}Das ist mein Thread, der meine CAB installieren soll. Meine Anwendung wartet nun mit "WaitForSingleObject" auf die Beendigung des Threads um weiter machen zu können.
Habt ihr irgentwelche Vorschläge?
Gruß
Nightmare