![]() |
Thread mit Timeout
Hi,
ich möchte externe Programme starten. Dazu nimm ich die Funktion von hier im Board (ExecuteAndWait). Wobei ich nicht warte sondern die Anwendung einfach starte. Nun habe ich das in einen eigenen Thread ausgelagert. D.h. wenn ich den Thread erzeuge führt dieser den Start des Programmes aus und beendet sich danach selber wieder. Nun habe ich ein Problem wenn sich z.B. das Programm nicht starten lässt. Z.b. wenn eine Abfrage von Kaspersky kommt ob es gestartet werden darf. Dann bleibt es in der ExecuteAndWait stehen und der Thread beendet sich nicht. Kann man einem Thread einen Timeout mitgeben das er sich dann trotzdem nach 2 Sekunden selbst beendet - auch wenn das ausführen nicht erfolgreich war? |
Re: Thread mit Timeout
Hallo schwa226.
Zitat:
Du musst selber im Code entscheiden wenn deine Abarbeitung beendet ist. Verwende ein Sperrobject mit Timeot (WaitForSingleObject etc.) lg. Astat |
Re: Thread mit Timeout
Zitat:
![]() |
Re: Thread mit Timeout
Ich benutze ja
![]() Aber es kann bei einem Fehler passieren das es in der Zeile:
Delphi-Quellcode:
hängen bleibt.
Result := ShellExecuteExW(@ShExecInfoW);
Werd mir das mit WaitForSingleObject mal ansehen! Mein erster Versuch war einen Timer in den Thread einzubauen (wie bei einer DLL). Wenn der Timer auslöst sollte er den Thread abschießen. Das klappt aber nicht so ganz, da der Thread ja auch Terminate nicht anspricht wenn er hängt. Wie kann man einen Thread am besten zum Beenden zwingen? |
Re: Thread mit Timeout
Keiner eine Info wie man einen hängenden Thread beenden kann ohne den Prozess beenden zu müssen?
:cry: |
Re: Thread mit Timeout
Zitat:
Du kannst das ja dann a la MS regeln: "Dieses Programm hat einen Fehler gemacht und muss sich beenden". Gruss Reinhard |
Re: Thread mit Timeout
Zitat:
![]() |
Re: Thread mit Timeout
Zitat:
schön und gut, aber das muss man dann in einem anderen thread aufrufen - wenn man Wait.. aufruft, wartet der thread ja nur. WaitForSingleObjectUndTuInzwischenWas gibt es meines Wissens nicht. Der Link führt übrigens zu einer Fehlermeldung. Gruss Reinhard |
Re: Thread mit Timeout
Hallo Reinhard Kern.
Zitat:
Anbei ein Ansatz wie soetwas realisiert werden kann.
Delphi-Quellcode:
lg. Astat
function StartPEFile(szFileName: PChar; Visibility: integer; szWorkDir: PChar;
dwTimeOut: DWORD = 10000): integer; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin Result := -1; FillChar(StartupInfo, Sizeof(StartupInfo), 0); StartupInfo.cb := Sizeof(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := Visibility; if CreateProcess( nil, { pointer to command line string } szFileName, nil, { pointer to process security attributes } nil, { pointer to thread security attributes} false, { handle inheritance flag } CREATE_NEW_CONSOLE or { creation flags } NORMAL_PRIORITY_CLASS, nil, { pointer to new environment block} szWorkDir, { pointer to current directory name } StartupInfo, { pointer to STARTUPINFO } ProcessInfo) { pointer to PROCESS_INF } then begin //-- Max Timeot warten bis Application MSQ gestartet hat. if WaitforInputIdle(ProcessInfo.hProcess, dwTimeOut) = 0 then //-- Ist en Errorcode vorhanden? GetExitCodeProcess(ProcessInfo.hProcess, DWORD(Result)) else Result := -1; //-- ProcessInfo Struct kann auch global zwischengespeichert werden, //-- um nachträglich wieder auf die Application zuzuggreifen, bzw. zu steuern CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); end; end; function StarterThread(ptrData: Pointer): Integer; begin if StartPEFile(PChar('c:\myProg.exe'), SW_SHOWNORMAl, nil) <> 0 then RaiseLastWin32Error; end; var _hStartThread, _dwServerThreadID: DWORD; begin //-- Programm Asynchron Starten (StarterThread) //-- Eventuelle Startparameter können über Heap oder Stack ünergeben werden //-- Achtung Stackvariablen sind nach verlassen der Procedure nicht mehr gültig. //-- _hStartThread kann wenn notwendig auch eine Globale Threadliste usw. sein. //-- Damit ist es möglich nachträglich den Thread zu steuern _hStartThread := BeginThread(nil, 0, StarterThread, nil, 0 ,_dwServerThreadID); end. |
Re: Thread mit Timeout
Hallo,
bist du sicher, dass das mit CREATE_NEW_CONSOLE funktioniert? Zitat aus MSDN: "If this process is a console application or does not have a message queue, WaitForInputIdle returns immediately." Ausserdem wird doch auch dabei der Prozess von "aussen" auf Timeout überwacht - war meine Rede seit 45. Gruss Reinhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz