AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi prüfen, ob ein "Job" noch läuft
Thema durchsuchen
Ansicht
Themen-Optionen

prüfen, ob ein "Job" noch läuft

Ein Thema von writeln · begonnen am 17. Dez 2009 · letzter Beitrag vom 18. Dez 2009
Antwort Antwort
Benutzerbild von writeln
writeln

Registriert seit: 30. Aug 2004
Ort: Hamburg
28 Beiträge
 
#1

prüfen, ob ein "Job" noch läuft

  Alt 17. Dez 2009, 11:02
Ich habe ein Programm entwickelt, dass Daten zwischen verschiedenen Datenbanken (ODBC) und / oder Outlook syncronisiert.
Das Programm wird über Job-Definitionen (Ini-Dateien) gesteuert. die jeweilige Jobdefinition wird beim Programmstart per Kommando-Parameter mitgegeben.
Zur Zeit schreibe ich an einem Scheduler, der die Jobs zeit-, bzw. ereignisgesteuert ausführt. Mehrere unterschiedliche Jobs dürfen dabei parallel laufen, jedoch nicht zwei gleiche Jobs.

Hier liegt der Knackpunkt:

Ich möchte feststellen,
1. ob die JobEXE läuft (ok, geht mit IsExeRunning, bzw. über die Windows Prozessliste)
2. ob ein bestimmter Job bereits ausgeführt wird (z.B. "adr_odbc2mapi")
der Job darf dann nicht doppelt ausgeführt werden.

Da die JobEXE auch noch manuell per Kommandozeile, bzw. per Desktop Verknüpfung gestartet werden kann, scheidet eine Prüfung per Jobtabelle aus.
Auch die Lösung, eine Logdatei zu schreiben, in die die JobEXEn laufend ihren Staus eintragen möchte ich vermeiden. Die Gefahr, dass Jobs sich bei Abstürzen nicht korrekt austragen ist mir zu groß.

Ich suche nach einer möglichst zuverlässigen Lösung, die auf der jeweiligen Maschine prüft, wie oft die JobEXE läuft und identifiziert, welche Jobs die einzelnen Instanzen gerade bearbeiten. Die Windows Jobliste scheint das nicht her zu geben.

Hat jemand eine Idee?
Sascha
...und ich sach noch: "drück nich auf F9"...
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

Re: prüfen, ob ein "Job" noch läuft

  Alt 17. Dez 2009, 11:07
Hallo,

per Mutex?

Mit IsExeRunning prüfen, ob das Programm läuft und/oder für jeden Job einen Mutex mit dem Jobnamen setzen bzw. prüfen, ob es den Mutex schon gibt und dann das Programm beenden oder mit anderem Job fortfahren oder wie immer der Arbeitsablauf aussehen mag.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: prüfen, ob ein "Job" noch läuft

  Alt 17. Dez 2009, 11:09
- registriere eine globale Windows-Message
- implementiere eine Nachrichtenbehandlung auf die Message,
welche auf Anfrage rausgibt, was das Programm macht
- finde die aktiven Instanzen deiner Anwendung
- frage über diese Message die anderen Instanzen, ob was sie abarbeiten und vergleiche es mit dem Job, welchen die Anwendung grad/gleich ausführen soll, wenn eine der anderen Anwendungen das Selbe macht, dann brich ab
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von writeln
writeln

Registriert seit: 30. Aug 2004
Ort: Hamburg
28 Beiträge
 
#4

Re: prüfen, ob ein "Job" noch läuft

  Alt 17. Dez 2009, 12:09
Danke für die Lösungsvorschläge, beide klingen gut!

Mit Mutex Handles habe ich doch irgendwann schon mal was gemacht?

Mit Windows Messages habe ich noch nicht gearbeitet, klingt deutlich komplizierter.
Allerdings ließe sich damit nebenbei auch noch eine Kommunikation mit den Scheduler betreiben (Übermittlung der Job-Stati).
(Ich glaube, die Weihnachtstage sind gelaufen...)

Vielen Dank euch beiden!
Sascha
...und ich sach noch: "drück nich auf F9"...
  Mit Zitat antworten Zitat
Benutzerbild von writeln
writeln

Registriert seit: 30. Aug 2004
Ort: Hamburg
28 Beiträge
 
#5

Re: prüfen, ob ein "Job" noch läuft

  Alt 17. Dez 2009, 14:19
Ok, die Mutex Lösung hat jetzt ca. 5 Mnuten in Anspruch genommen

Delphi-Quellcode:
  public
    { Public-Deklarationen }
    // Formular Steuerung
    hMutex: THandle;
    CurrJobName: string;
    ...

procedure TFormCWSSrv.FormCreate(Sender: TObject);
begin
  // Formular vorbereiten und CurrJobName ermitteln
  ...

  // Mutex Prüfung
  hMutex := CreateMutex(NIL, True, PChar(CurrJobName));
   if (hMutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
   begin
     CloseHandle(hMutex);
     halt;
  end
  else
    // Job zeitverzögert starten
    TimerJobStart.Enabled:= true;
end;
Die Lösung tut genau, was sie soll...
Windows Messages als Alternative werde ich mir aber trotzdem mal genau ansehen.

Nochmal Danke!
Sascha
...und ich sach noch: "drück nich auf F9"...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: prüfen, ob ein "Job" noch läuft

  Alt 17. Dez 2009, 15:27
Ist CurrJobName der Dateiname inkl. des kompletten Pfades?
Dieses wäre zumindestens besser, da man ja sonst leich gleich Namen für unterschiedliche Jobs haben kann.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von writeln
writeln

Registriert seit: 30. Aug 2004
Ort: Hamburg
28 Beiträge
 
#7

Re: prüfen, ob ein "Job" noch läuft

  Alt 18. Dez 2009, 12:59
CurrJobName beinhaltet tatsächlich nur den Namen des Jobs ("odbc2mapi", etc..).
Das reicht in meinem Falle aus, da die Jobdateien in einer fest definierten Verzeichnisstruktur liegen (<AppDir>\Settings\Jobs, <AppDir>\Settings\Logs, usw...).

Will man die Lösung allgemeiner nutzen, also mit beliebigen Speicherorten der Jobdefinitionen unter "Eigene Dokumente", oder ähnlich, müsste allerdings der ganze Datei-Pfad im Mutex angegeben werden.
Sascha
...und ich sach noch: "drück nich auf F9"...
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:51 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