Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi WaitForSingleObject (https://www.delphipraxis.net/167504-waitforsingleobject.html)

ONeill 2. Apr 2012 20:47

WaitForSingleObject
 
Hallo Leute,

mal wieder ne eher kleine Frage mit großen Auswirkungen ;)
Ich habe ein kleines Programm, welches bisher nicht mehr tut als ein paar Befehle an Androidspezifische Kommandozeilenprogramm (adb, fastboot) zu schicken.
Das läuft auch alles ganz klasse. Damit sich das Programm nicht komplett aufhängt, nur weil die fastboot.exe (Androidprogramm) auf ein Gerät wartet, habe ich folgende Line hinzugefpgt:
Code:
repeat
          WaitHandle := WaitForSingleObject(procInfo.hProcess, 200);
          Application.ProcessMessages;
        until application.terminated or (WaitHandle <> WAIT_TIMEOUT);
Das klappt bei adb.exe auch wunderbar, nur leider nicht bei der fastboot.exe, da die anscheinend weiterhin als "aktiv" gilt.
Nun ist meine Frage, wie kann ich das Programm trotzdem nach max. 20 Sekunden beenden, damit das Programm dann eine Fehlermeldung ausgeben kann?
Ein Lösungsansatz wäre zum Beispiel während der Ausführung zu prüfen ob ein bestimmter Text als Rückgabe aus der Kommandozeile kommt (wait for device). Allerdings weiß ich nicht, wie man das mit Delphi realisiert während der Ausführung das Ergebnis zu bekommen (wahrscheinlich nicht möglich ;))

Bin für jede Hilfe dankbar, auch wenn ich mal wieder ggf. Tomaten auf den Augen habe ;)

Luckie 2. Apr 2012 20:49

AW: WaitForSingleObject
 
200 Millisekunden sind keine 20 Sekunden.

ONeill 2. Apr 2012 20:54

AW: WaitForSingleObject
 
Jap, da hast du natürlich Recht (das meinte ich mit den Tomaten auf den AUgen ;)) ALlerdings müsste sich ja die fastboot.exe dann noch schneller schließen, was die ja schon gar nicht tut. Ist also eher jetzt erstmal ein schönheitsfehler :)
Trotzdem danke für den Hinweis.

Luckie 2. Apr 2012 21:03

AW: WaitForSingleObject
 
Siehst du sie denn noch im Taskmanager in der Prozessliste? Und wird die fastboot.exe auch direkt von deinem Prozess gestartet? ist das Prozesshandle gültig?

ONeill 2. Apr 2012 21:09

AW: WaitForSingleObject
 
Jap, die läuft ja auch vor meinen Augen ohne Probleme weiter, so wie es sein soll. Allerdings wird eben der Prozess nicht beendet.

Aber ich hatte nun wirklich Tomaten auf den Augen. Ich habe es nun wie folgt gelöst:
Code:
repeat
          WaitHandle := WaitForSingleObject(procInfo.hProcess, 2000);
          Application.ProcessMessages;
          closed := closed+1;
        until application.terminated or (WaitHandle <> WAIT_TIMEOUT) or (closed = 10);
        if closed = 10 then
        begin
          killtask('fastboot.exe');
          killtask('adb.exe');
        end
Also sprich: ich habe einfach einen Zähler eingebaut, der sich erhöht. Wird dort eine gewisse Höhe erreicht, wird der Prozess einfach beendet.

Ist das so auch ressourcenschonend?

Dalai 2. Apr 2012 21:14

AW: WaitForSingleObject
 
Warum benutzt du zum Beenden der Prozesse nicht gleich das eh schon vorhandene Handle in
Delphi-Quellcode:
procInfo.hProcess
? Einen Prozess mit seinem Namen zu töten, ist eine ganz dumme Idee, wenn sich noch andere gleichnamige Prozesse auf dem System tummeln...

MfG Dalai

Luckie 2. Apr 2012 21:17

AW: WaitForSingleObject
 
Ich glaube, das wird langsam zum Running Gag. Auch 2.000 Millisekunden sind keine 20 Sekunden.

himitsu 2. Apr 2012 21:21

AW: WaitForSingleObject
 
@Luckie: 10 * 2000 :zwinker:

ressourcenschonend ja, aber muß es denn gleich in einem Mord (Kill) enden?

ONeill 4. Apr 2012 21:05

AW: WaitForSingleObject
 
Das ist kein Gag leute, das ist ein wirkliches Problem, schade das es anders rüberkommt. Zumal die Zeit nicht wirklich relevant für das Problem ist!

@himitsu:
Leider ja, da der User an sich das CMD-Fenster nicht sehen soll. Sollte der Prozess nicht nach einer bestimmten Zeit beendet werden, so sieht der User die ganze Zeit nur ein einfaches "Bitte warten...".
Und da man als normaler User da nicht ewig warten will, wird dann praktisch nach der Zeit ein Errorform angezeigt :)
Mal gleich ne andere Frage, auch wenn es nicht hierher gehört:
Ich habe mir eine config.ini geschrieben und dort einen wert imgfile gesetzt. Der sollte entweder 1 oder 0 sein.
Nun lese ich den Wert aus und das Programm soll je nachdem wie der Wert ist eine Abfolge von Befehlen ausführen oder eine andere:
Code:
if ini.ReadInteger('functions', 'imgfile', 0) = 1 then
  begin
    //tu die Abfolge
  end
  else
  begin
    //tu das andere
  end;
Eigentlich recht simpel. Allerdings habe ich das Problem, das der erste Programmablauf ausgeführt wird, wenn der Wert imgfile eine 1 ist, aber das Programm gar nichts mehr tut, wenn es keine 1 ist. Also wirklich gar nichts mehr. Nach dem Ausführen des Befehls davor, der immer gleich sein soll, wird das Programm an sich noch angezeigt, also keine exception oder ähnliches, allerdings wird keine Programmabfolge mehr ausgeführt, weder das in der if clause, noch in der else clause, noch der Programmcode nach danach.

Kann sich das einer erklären, oder hat einer einen Vorschlag, wie ich dem "Fehler" auf den Grund gehen kann?

Luckie 4. Apr 2012 21:22

AW: WaitForSingleObject
 
Zitat:

Zitat von ONeill (Beitrag 1160278)
Mal gleich ne andere Frage, auch wenn es nicht hierher gehört:

Dann mach dafür bitte auch einen neuen Thread auf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 Uhr.
Seite 1 von 2  1 2      

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