AGB  ·  Datenschutz  ·  Impressum  







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

Ersten Programmaufruf feststellen?

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

Registriert seit: 10. Mär 2006
34 Beiträge
 
#1

Ersten Programmaufruf feststellen?

  Alt 11. Dez 2009, 16:03
Wie kann ich feststellen ob mein Programm seit dem Windows Start bereits einmal gestartet wurde oder es der erste Start ist?

Zum Hintergrund:
Ich schreibe einen Dienst der andere Programme starten und überwachen soll.

Bei diesen Programmen soll ein verzögerter Programmstart möglich sein (Warten bis alles Geladen wurde).
Allerdings nur wenn der Rechner neu gestartet wurde.
Bei einem Stoppen und Starten des Dienstes sollte es keine Verzögerung geben.

Ich hab schon an GetTickCount gedacht doch der läuft ja über.
Mit Beschränkung von GetTickCount umgehen hab ich einen Zeitgeber der nicht überläuft aber wie lange dauert ein Windowsstart?

Ich hab schon an einen Mutex gedacht kenn mich da aber zu wenig aus.
Wenn ich einen Mutex registriere und benenne kann ich den später auch wieder finden.
Meines Wissens schließt sich aber der Mutex wenn das Programm beendet wird.

Ich brauch was das offen bleibt und das ich abfragen kann ob es vorhanden ist. Nur was?

Vielleicht hat ja von euch wer die die zündende Idee.

Danke Jakson
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.073 Beiträge
 
Delphi 12 Athens
 
#2

Re: Ersten Programmaufruf feststellen?

  Alt 11. Dez 2009, 16:05
Mutex wird gelöscht, wenn dein Service beendet wird ... bringt also nix

wie meinst du das mit dem GetTickCount (PS: das läuft erst über, wenn Windows ~48 Tage am Stück läuft)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

Re: Ersten Programmaufruf feststellen?

  Alt 11. Dez 2009, 16:20
Benutze als Merker doch eine Datei. Wenn sie nicht existiert, ist es der erste Start. Falls doch, prüfe ob der Erstellungszeitpunkt älter ist als der Windows-Start, was ebenfalls auf einen ersten Start hindeutet. In jedem Fall erzeugst du die Datei am Ende neu.

Das Ganze läßt sich auch mit einem Log-File und dem letzten Zugrifszeitpunkt realisieren.
Uwe Raabe
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Ersten Programmaufruf feststellen?

  Alt 11. Dez 2009, 16:34
Zitat von Jakson:
Ich hab schon an GetTickCount gedacht doch der läuft ja über.
ab Vista kann GetTickCount64 benutzt werden: http://en.wikipedia.org/wiki/GetTickCount

Systemvoraussetzungen also entsprechend angeben

Oder - wenn es ein Dienst ist - eventuell kann man über die Service API erkennen ob es ein Systemstart oder ein manueller Start des Dienstes ist?

Viele Grüße,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Astat

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

Re: Ersten Programmaufruf feststellen?

  Alt 11. Dez 2009, 18:24
Hallo Jakson.
  • Jakson hat geschrieben.
Zitat:
Ich schreibe einen Dienst der andere Programme starten und überwachen soll.
Wenn ich dich richtig verstehe benötigst Du einen verzögerten Systemstart eines Windows Dienstes (services)
beim Erststart des Systems (Reboot)?

Willst du dies in deinem Programm nachbauen, könntest du folgendes versuchen.

Erstelle einen Eintrag in der Atomtabelle des Systems.
Dieser wird erst gelöscht wenn du das System rebootest.

Delphi-Quellcode:

GlobalAddAtom(PChar('{D1F85078-F653-4AA7-AB07-765E94EBF349}'));

GlobalFindAtom(PChar('{D1F85078-F653-4AA7-AB07-765E94EBF349}'));
  if ATOM <> 0 then showmessage('ATOM allready set!');

lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Jakson

Registriert seit: 10. Mär 2006
34 Beiträge
 
#6

Re: Ersten Programmaufruf feststellen?

  Alt 14. Dez 2009, 09:20
Super. Danke das ist genau das was ich wollte.

Soweit ich das Verstanden habe kann ich jeden beliebigen String in die GlobalAtom Tabelle einfügen.

Warum fügst du genau den ein? "{D1F85078-F653-4AA7-AB07-765E94EBF349}"
Für mich schaut das wie der Identifier eines Interfaces aus?

Gibts irgend welche Richtlinien was ich in die GlobalAtom Tabelle einfügen darf (Ausser das es unter 255 Zeichen sein soll)?

Danke Jakson
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Ersten Programmaufruf feststellen?

  Alt 14. Dez 2009, 09:43
Zitat von Jakson:
Super. Danke das ist genau das was ich wollte.

Soweit ich das Verstanden habe kann ich jeden beliebigen String in die GlobalAtom Tabelle einfügen.

Warum fügst du genau den ein? "{D1F85078-F653-4AA7-AB07-765E94EBF349}"
Für mich schaut das wie der Identifier eines Interfaces aus?

Gibts irgend welche Richtlinien was ich in die GlobalAtom Tabelle einfügen darf (Ausser das es unter 255 Zeichen sein soll)?

Danke Jakson
Das ist einfach nur eine systemweit eindeutige GUID. Das stellt sicher, dass es dieses Atom nicht schon gibt. Könnte ja theoretisch sein, dass wenn du dein Atom "Test" nennst ein anderes Programm sein Atom genauso genannt hat und dann funktionierts ja nichtmehr
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#8

Re: Ersten Programmaufruf feststellen?

  Alt 17. Dez 2009, 00:47
Zitat von Jakson:
Super. Danke das ist genau das was ich wollte.
Wenn die Frage beantwortet ist, dann markier sie auch als beantwortet. Sie ist ja immer noch als 'offene Frage' markiert.

Ansonsten geht es auch relativ leicht mit GetTickCount(). Hier ein kleiner Pseudo-Code dazu:

Delphi-Quellcode:
// lade den Zeitpunkt des letzten Programmstartes (wenn schon 1 Mal gespeichert)
// Systemstart = Now() - GetTickCount();
// if (Systemstart > letzter Programmstart) then "Das ist der erste Programmstart seit dem Reboot"
// speichere den Zeitpunkt dieses Programmstartes
Nach etwa 48 oder 49 Tagen läuft der Timer von GetTickCount() über. Einen Rechner solange laufen lassen, das gehört schon zu einem Extremfall.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Ersten Programmaufruf feststellen?

  Alt 17. Dez 2009, 03:56
Zitat von Cicaro:
Einen Rechner solange laufen lassen, das gehört schon zu einem Extremfall.
Ausser es handelt sich um einen Server, dann sollte man eher vom Normalfall ausgehen

@Jakson:
Sicherheitshalber solltest Du Dir aber eine eigene GUID generieren, und nicht die von Astat verwenden.
Einfach in der IDE [STRG]+[SHIFT]+[G] drücken.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Jakson

Registriert seit: 10. Mär 2006
34 Beiträge
 
#10

Re: Ersten Programmaufruf feststellen?

  Alt 17. Dez 2009, 08:02
Danke nochmal

Das mit der GUID hat mir bis jetzt noch keiner erklärt bzw. es ist anscheinend so trivial das es auch nirgens in den Büchern erwähnt wird.

Aber dank WikiPedia bin ich jetzt schlauer http://de.wikipedia.org/wiki/GUID

Ich versteh zwar immer noch nicht warum das Ding 100% eindeutig ist aber wenn die das behaupten.

Und ja es ist für einen Server gedacht der eigentlich nie angerührt wird.
Unsere längste uptime war ca. 2 Jahre

Jakson
  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 16:46 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