Frage zu Threads
-
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
-
Wie merker schon sagte - mit WaitForSingleObject() und Kollegen (der wartet darauf, daß das übergebene Handle "signalisiert" wird - und ein Thread- oder Prozess-Handle schaltet auf "signalisiert", wenn der zugehörige Thread bzw. Prozess sich beendet hat).
-
OK habs hinbekommen

Vielen Dank für eure Hilfe!
Gruß
Nightmare