Entwickler-Ecke
Windows API - Prozess Terminieren, während ich prüfe ob er noch offen ist!
JJ - Di 02.09.08 22:34
Titel: Prozess Terminieren, während ich prüfe ob er noch offen ist!
Hallo Leute!
Ich benötige eure Hilfe bezüglich eines Problems (war zu erwarten oder? ich habe es trotzdem mal so formuliert ;-)
Ich möchte einen thread so lange anhalten, bis eine Anwendung die über ihn gestartet wurde wieder beendet ist.
Das hat soweit auch absolut super funktioniert, aber wenn es auf der GUI irgendwelche Veränderungen gibt, soll die gestartete Applikation (auf deren Ende gewartet wird) bereits vorzeitig terminiert werden.
Ich bekomme etwa 1000000 Access Violations uns weiß eigentlich auch warum ;-), aber nicht wie ich es anders machen kann.
Ich muss noch irgendetwas machen bevor ich den Process terminieren kann.
Wichtig ist, dass ich auch GENAU DIE INSTANZ des Programmes Terminiere die in exinfo ist.
Liegts vielleicht daran ,dass ich keinen ExitCode angegeben habe?
Es folgt mein Codefetzen :-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| procedure Download.StartAndWait(FileName: string; Params: string; Name : string); var exInfo: TShellExecuteInfo; Ph: DWORD; begin FillChar(exInfo, SizeOf(exInfo), 0); with exInfo do begin cbSize := SizeOf(exInfo); fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT; Wnd := GetActiveWindow(); ExInfo.lpVerb := 'open'; ExInfo.lpParameters := PChar(Params); lpFile := PChar(FileName); nShow := SW_HIDE; end; if ShellExecuteEx(@exInfo) then Ph := exInfo.HProcess else begin ShowMessage(SysErrorMessage(GetLastError)); Exit; end; while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do begin if Abgebrochen then begin TerminateProcess(Exinfo.HProcess,Null); if fileexists(form6.SavetoPath+Name+'.flv') then deletefile(form6.SaveToPath+Name+'.flv'); if fileexists(form6.SavetoPath+Name+'.avi') then deletefile(form6.SaveToPath+Name+'.avi'); if fileexists(form6.SavetoPath+Name+'.mp4') then deletefile(form6.SaveToPath+Name+'.mp4'); if fileexists(form6.SavetoPath+Name+'.mp3') then deletefile(form6.SaveToPath+Name+'.mp3'); break; exit; end; Application.ProcessMessages; end; CloseHandle(Ph); end; |
Moderiert von
Narses: Topic aus Dateizugriff verschoben am So 07.09.2008 um 23:08
BenBE - Fr 05.09.08 13:27
Du wartest statt unendlich einfach nur sagen wir 100ms im Thread, dafür aber in einer Schleife. Der WaitForSingleObject-Befehl liefert dir einen Status zurück. Ist dieser TIMEOUT, läuft die andre Anwendung noch, ist dieser OBJECT_0, wurde die Anwendung beendet.
BEvor du nun aber erneut wartest, überprüfst Du einen globalen Status (der vom Mainthread hereingereicht wird), ob die Anwendung terminiert werden soll.
JJ - Sa 06.09.08 15:06
danke für deine Antwort, aber ist das nicht genau das was ich tue? Ich prüfe anhand einer Bariable (Boolean) ob ich die anwendung terminieren soll... nur er macht es halt nicht ohne fehlermeldung (das terminieren)
BenBE - Sa 06.09.08 16:36
Könntest Du die Art des Fehlers bitte etwas genauer dann erklären???
Hast Du für deine Strukturen überall Speicher alloziiert?
Warum nutzt Du den With-Block nicht vollständig, wenn Du ihn schon angibst?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!