![]() |
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:
Das klappt bei adb.exe auch wunderbar, nur leider nicht bei der fastboot.exe, da die anscheinend weiterhin als "aktiv" gilt.
repeat
WaitHandle := WaitForSingleObject(procInfo.hProcess, 200); Application.ProcessMessages; until application.terminated or (WaitHandle <> WAIT_TIMEOUT); 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 ;) |
AW: WaitForSingleObject
200 Millisekunden sind keine 20 Sekunden.
|
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. |
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?
|
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:
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.
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 Ist das so auch ressourcenschonend? |
AW: WaitForSingleObject
Warum benutzt du zum Beenden der Prozesse nicht gleich das eh schon vorhandene Handle in
Delphi-Quellcode:
? Einen Prozess mit seinem Namen zu töten, ist eine ganz dumme Idee, wenn sich noch andere gleichnamige Prozesse auf dem System tummeln...
procInfo.hProcess
MfG Dalai |
AW: WaitForSingleObject
Ich glaube, das wird langsam zum Running Gag. Auch 2.000 Millisekunden sind keine 20 Sekunden.
|
AW: WaitForSingleObject
@Luckie: 10 * 2000 :zwinker:
ressourcenschonend ja, aber muß es denn gleich in einem Mord (Kill) enden? |
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:
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.
if ini.ReadInteger('functions', 'imgfile', 0) = 1 then
begin //tu die Abfolge end else begin //tu das andere end; Kann sich das einer erklären, oder hat einer einen Vorschlag, wie ich dem "Fehler" auf den Grund gehen kann? |
AW: WaitForSingleObject
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:07 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