Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Prüfen, ob erster Start nach booten (https://www.delphipraxis.net/159384-pruefen-ob-erster-start-nach-booten.html)

kub 25. Mär 2011 14:12

Prüfen, ob erster Start nach booten
 
Hi,

ich habe eine Anwendung, die auf Hardware zugreifen muss. Die exe wird beim Start von WindowsXP gestartet -> Autostart.

Jetzt habe ich das Problem, dass die Treiber der Hardware noch nicht bereit sind, wenn meine exe gestartet wird und ich Fehler bekomme, die ich nur mit größerem Aufwand alle abfangen kann. Um das zu Umgehen, habe ich eine zweite Exe, die eine entsprechende Meldung zeigt und die eigentliche Exe nach einem bestimmten delay startet.

Jetzt würde ich das Ganze gerne ohne zweite exe lösen. Einfach ein delay beim Start geht nicht, da mein Programm öfter mal geschlossen und geöffnet wird und das delay dann nerven würde. Beim Systemstart kommt es auf 10sec nicht mehr an.

Kann ich irgendwie herausfinden, ob meine exe während dieser Windows Sitzung schon mal gelaufen ist. Kann man, z.B. ein Flag in der Registry setzen, das beim Herunterfahren von Windows automatisch gelöscht wird?

Gruß
Thomas

jfheins 25. Mär 2011 14:39

AW: Prüfen, ob erster Start nach booten
 
Du könntest dazu einen Mutex verwenden. Die existieren solange bis du sie löschst, oder der Rechner neugestartet wird.

Dann müsste man vielleicht noch an den Rihezustand denken - sind die Treiber danach sofort bereit?

Björn Ole 25. Mär 2011 14:40

AW: Prüfen, ob erster Start nach booten
 
GetTickCount liefert dir die Millisekunden seit Systemstart. Bei Programmende könntest du diesen Wert in eine Datei schreiben, beim Starten auslesen und mit dem aktuellen GetTickCount vergleichen. Ist der aktuelle kleiner als der aus der Datei, wurde neugestartet. Beachte aber die Begrenzung von 49 Tagen.

alfold 25. Mär 2011 14:41

AW: Prüfen, ob erster Start nach booten
 
Zitat:

Zitat von kub (Beitrag 1090956)
....ich habe eine Anwendung, die auf Hardware zugreifen muss. Die exe wird beim Start von WindowsXP gestartet -> Autostart.

Selbst geschrieben die Anwendung? Wenn ja, warum prüfst du nicht in deinem Prog ob der Zugriff auf die Hardware möglich ist.
Wenn nicht solange repeat bis es möglich ist.
Alles andere find ich nicht gut als Lösung!

Nicht selbst geschrieben die Anwendung mh... ohne zusätzliches nicht möglich!

alfold

kub 25. Mär 2011 15:22

AW: Prüfen, ob erster Start nach booten
 
Danke für eure Hilfe!

Ich schau mal, ob mir die Mutex oder GetTickCount Lösung besser gefällt. Der Rechner gehört zu einer Produktionsanlage,d.h. hier gibt es keinen Ruhezustand, den ich beachten muss.

Das Problem mit diesem Ansatz zu lösen gefällt mir auch nicht wirklich. Leider wird der Fehler nicht gleich beim Laden des Treibers bemerkt, sondern erst nach einigen weiteren Initialisierungen . Um den Fehler sauber zu lösen, müsste ich meinen Ablauf ändern, aber da ich im Moment keine Zeit habe dies dann sauber zu testen werde ich die Umstellung mit dieser "Brücke" noch etwas hinausschieben.

rollstuhlfahrer 25. Mär 2011 17:29

AW: Prüfen, ob erster Start nach booten
 
Werden Mutexe nicht automatisch gelöscht, wenn die öffnende Anwendung verschwindet? - Zumindest bei mir war/ist das so.

Bernhard

ADD: So und nun die Auflösung, wie man es anders machen kann: Global Atom: Das kann man setzen und dann kann man immer wieder auslesen, ob das noch da ist. Diese Tabelle wird nach dem abmelden wieder geleert, aber dann würde auch der Autostart nach erfolgter Anmeldung ausgeführt werden.

Bummi 25. Mär 2011 19:23

AW: Prüfen, ob erster Start nach booten
 
Zitat:

Jetzt habe ich das Problem, dass die Treiber der Hardware noch nicht bereit sind, wenn meine exe gestartet wird
Geht es wirklich um Treiber, oder um Dienste, deren Status könnte man abfragen und solange Ideln....

isilive 26. Mär 2011 12:54

AW: Prüfen, ob erster Start nach booten
 
Du könntest auch ein Atom in die globale Liste setzen.
Man erstellt Atome und kann danach abfragen ob es schon so eines gibt.
Ich denke diese bleiben auch bis zum nächsten Systemstart präsent - wenn man sie nicht löscht.

Delphi-Quellcode:
if GlobalFindAtom('EindeutigerName') = 0 then
  begin   //Erster Programmstart
    atom := GlobalAddAtom('EindeutigerName')
    ...Warteschleife... oder sonstwas...
  end;

Assarbad 26. Mär 2011 13:12

AW: Prüfen, ob erster Start nach booten
 
Zitat:

Zitat von kub (Beitrag 1090956)
Kann ich irgendwie herausfinden, ob meine exe während dieser Windows Sitzung schon mal gelaufen ist. Kann man, z.B. ein Flag in der Registry setzen, das beim Herunterfahren von Windows automatisch gelöscht wird?

Ja, das mit der Registry sollte in der Tat gehen, siehe MSDN-Library durchsuchenREG_OPTION_VOLATILE. Es gibt aber eine einfachere Methode, weil der Wert ja nicht gelöscht werden muß. Du kannst gucken wie lange das System schon läuft. Diesen Wert benutzt du und schreibst ihn in die Registry. Beim nächsten Start des Programms ist nur zu vergleichen ob der Vergleichswert bereits höher als die Startzeit des Systems ist.

Ist er Treiber von euch? In diesem Fall sollte der Treiber korrigiert werden.

kub 28. Mär 2011 08:41

AW: Prüfen, ob erster Start nach booten
 
Guten Morgen,

ich habe am Wochenende eine Methode gefunden, den Fehler gleich nach dem Laden des Treibers zu provozieren. Mit GetTicCount frage ich ab, wie lange der Rechner schon läuft und in den ersten Minuten erhöhe ich die Timeouts und Anzahl der Retry. Damit muss der Bediener bei späteren Starts nicht unnötig lange auf die Fehlermeldung warten (Fehler kann auch durch falsche Einstellungen auftreten) und nach dem Booten ist das Timingproblem gelöst.

Vielen Dank noch mal an alle!

Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 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