AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread mit Timeout

Ein Thema von schwa226 · begonnen am 17. Dez 2009 · letzter Beitrag vom 19. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2      
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

Thread mit Timeout

  Alt 17. Dez 2009, 16:26
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?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#2

Re: Thread mit Timeout

  Alt 17. Dez 2009, 17:05
Hallo schwa226.

Zitat von schwa226:
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?
Nein, einen offiziellen Weg (in der Thread API integriert) gibt es da nicht.
Du musst selber im Code entscheiden wenn deine Abarbeitung beendet ist.
Verwende ein Sperrobject mit Timeot (WaitForSingleObject etc.)

lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#3

Re: Thread mit Timeout

  Alt 17. Dez 2009, 17:15
Zitat:
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.
und warum nicht möchtest du nicht Delphi-Referenz durchsuchenShellExecute nutzen ?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#4

Re: Thread mit Timeout

  Alt 18. Dez 2009, 07:41
Ich benutze ja ShellExecute!

Aber es kann bei einem Fehler passieren das es in der Zeile:
Result := ShellExecuteExW(@ShExecInfoW); hängen bleibt.

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?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#5

Re: Thread mit Timeout

  Alt 18. Dez 2009, 12:13
Keiner eine Info wie man einen hängenden Thread beenden kann ohne den Prozess beenden zu müssen?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#6

Re: Thread mit Timeout

  Alt 18. Dez 2009, 13:02
Zitat von schwa226:
Keiner eine Info wie man einen hängenden Thread beenden kann ohne den Prozess beenden zu müssen?
:cry:
Doch, sicher, von aussen: such nach kill thread und lass das Hauptprogramm den Thread überwachen. NUR: das ist kein "graceful shutdown", sondern entspricht dem Beenden durch Ctrl-Lt-Del mit allen möglichen Nebenwirkungen. Es kann ja auch logisch nicht anders sein. Es dürfte keine Möglichkeit geben, ein dabei verursachtes Memory Leak zu beseitigen.

Du kannst das ja dann a la MS regeln: "Dieses Programm hat einen Fehler gemacht und muss sich beenden".

Gruss Reinhard
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Thread mit Timeout

  Alt 18. Dez 2009, 13:51
Zitat von Astat:
Verwende ein Sperrobject mit Timeot (WaitForSingleObject etc.)
MSDN-Library durchsuchenWaitForSingleObjectTimeOut
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#8

Re: Thread mit Timeout

  Alt 18. Dez 2009, 17:08
Zitat von Luckie:
Zitat von Astat:
Verwende ein Sperrobject mit Timeot (WaitForSingleObject etc.)
MSDN-Library durchsuchenWaitForSingleObjectTimeOut
Hallo,

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
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#9

Re: Thread mit Timeout

  Alt 18. Dez 2009, 23:38
Hallo Reinhard Kern.

Zitat von Reinhard Kern:
..,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.
Naja etwas kreativität sollte man schon hineinfliessen lassen.

Anbei ein Ansatz wie soetwas realisiert werden kann.

Delphi-Quellcode:
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.
lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#10

Re: Thread mit Timeout

  Alt 19. Dez 2009, 01:07
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz