![]() |
Ist Anwendung noch aktiv
Hallo ich habe ein Programm geschrieben, dass die Kommunikationsordner zweier anderen Programme kontrolliert
es werden laufend von Prog. 1 Dateien in Ordner 1 gestellt und von Prog.2 dort abgeholt. Mein Programm kontrolliert ob die Dateien nicht zu lange im Ordner bleiben. - so weit so gut jetzt mein Problem was passiert wenn Prog.1 sich aufhängt ? Wie kann ich feststellen ob die beiden Progr.noch laufen und wie kann ich dann die Prozesse abschießen ? :cry: Danke im Voraus Kosta[/b] |
Moin Kosta,
zur Überprüfung ob die Programme noch laufen, wäre die API Funktion SendMessageTimeout geeignet. Abschiessen kannst Du die Prozesse dann mittels TerminateProcess. Diese Funktion sollte aber nur in Notfällen angewandt werden, da eventuelle Aufräumarbeiten (z.b. Freigabe von Resourcen, wie Speicher oder Handles) nicht mehr durchgeführt werden. Schau Dir die Funktionen doch mal im PSDK an. Sind die Programme, die überwacht werden müssen auch eigene oder sind es Fremdprogramme? |
Zitat:
Dies wird auch vom PSDK mehr oder weniger bestätigt: Zitat:
|
Moin Luckie,
hast Du auch wieder recht. Ich hab's gerade mal nachgelesen. Aber zuraten tut er auch nicht gerade. ;-) Wie auch immer, beim aktuellen Problem spielt's zum Glück eh' keine Rolle. |
Zitat:
Man sollte nur im Programm selber nicht mehr benötigte Ressourcen freigeben, sonst schießt man sich gerade unter Win9x selber in den Fuß. @Dingsbums: Kuck mal unter OpenSource, da habe ich gerade ein Programm vorgestellt, welches alle laufenden Prozesse auflistet. (Geht auch unter Consumer Windows, nur wird da bei den Modulen Müll ausgegeben - mehr oder weniger. Wenn du es also unter Win9x brauchst, nimm die Abfrage im Hauptprogramm raus. Das mit den Prozessen geht auch unter Win9x.) |
Hi Chris
Danke für deinen Tip Blos wie soll ich das machen mit SendMessageTimeout kannst du mir ein kleine Beispiel erstellen lt. Delphi-Hilfe muß ich SendMessageTimeout( HWND hWnd, // handle of destination window UINT Msg, // message to send WPARAM wParam, // first message parameter LPARAM lParam, // second message parameter UINT fuFlags, // how to send the message UINT uTimeout, // time-out duration LPDWORD lpdwResult // return value for synchronous call ); das alles übergeben woher bekomm ich das alles wenn ich nur weiß dass das Programm Prog.exe heißt ? :cry: |
Wenn du nur den Namen der Exe kennst, dann ist es über einen SnapShot und Terminateprocess am einfachsten. Es sei denn du kennst Fensterklasse und Titel des Hauptfensters der Anwendung.
Sag uns mal, was du hast oder rausbekommen könntest, dann können wir dir weiterhelfen. |
Ich habe den Namen der EXE-Datei (lt.Taskmanager / Prozesse)
bzw. der Text der ebenfalls im Taskmanager unter Anwendungen steht. somit denke ich mir dass ich eine Funktion bastle, die dann wie folgt aussieht Funktion AplAktiv(ProzessName:String) : boolean; begin wass soll ich hier reinschreiben ? end; Procedure KillApl(ProzessName : string); begin was muß hier stehen end; Procedure TForm1.Button1Click(Sender : Tobject); Begin If AplAktiv('winword.exe') then // das soll nur true sein wenn Programm gestartet & reagiert alles ok else KillApl('winword.exe'); ich weiß für euch ist das sicher ein klax - aber ich konnte nirgends etwas finden. noch besser wäre eine Funktion die mir folgende Informationen gibt 1) Prog. läuft 2) Prog. reagiert nicht 3) Prog. nicht gestartet :oops: Kosta |
Moin Kosta,
dazu noch mal ein paar Fragen: Müssen eigene Programme überwacht werden? Ist bekannt wo die Programme liegen (Pfad)? Werden die Programme von Deinem Programm aus gestartet? Ein allgemeiner Tip noch: Die Hilfe zur Windows API, die bei Delphi mitgeliefert wird (ich hab' selber ja auch D5 Pro) ist, gelinde gesagt, museumsreif. ;-) Besorg' Dir am Besten mal das aktuelle MS PSDK. ( ![]() Sind, vollständig, allerdings so 350 MB, also nicht gerade ISDN tauglich. Man kann aber auch weniger herunterladen. Wie ich gerade gesehen habe ist Oktober 2002 die aktuelle Version. |
Hallo Christian!
Zitat:
Ansonsten ist D5 ja schon älter und damit auch die API-Hilfe. Gruß Dietmar Brüggendiek |
Moin Dietmar,
Zitat:
Sieh' Dir mal an, wie gross die Datei ist, und dann vergleich das mal mit den hunderten von MB, die das komplette PSDK umfasst (auch wenn man das meist unnütze weglässt) Ausserdem hat man dann auch die aktuellen Header Dateien, und kann sich so manche Dinge, die fehlen selber nachrüsten. |
Hallo Christian!
So meinte ich das ja auch nicht. Es ist doch so: wenn ich z.B. weiß, daß das Ding "GetOEMCP" heißt, kann ich das irgendwo im Source eingeben, Cursor drauf und F1 liefert mit die Erklärung - und ich kann auch den Links folgen. Einfach F1 und im Index eingeben klappt dagegen nicht! Weiß ich aber gar nicht, was ich brauche, kann ich nur über WIN32.hlp die Suchfunktion nutzen - die Delphi-Hilfe kennt das alles nur DIREKT aus F1. Danke übrigens für den Tipp - werde mir das Ding mal runterladen, weil: "Django zahlt nicht im Internet, Django hat Flatrate!" Gruß Dietmar Brüggendiek |
Hallo Chris
Also das sind 2 Schnittstellenprogramme beide nicht von mir. Ich weiß aber wo sie liegen (pfad) beide Programme haben aber leider die angewohnheit, dass sie sich immer wieder aufhängen. mein programm soll überwachen ob beide noch laufen sollte das eine od. andere nicht mehr reagieren soll mein Programm den Prozess abschiessen und neu starten Kosta :cry: |
Moin Kosta,
da kommen wir der Sache ja schon näher ;-) Können die beiden Programme auch initial über Dein Programm gestartet werden? Würde ja prinzipiell Sinn machen, dass Dein Programm startet, feststellt, dass die beiden Programme nicht laufen, und diese dann startet. |
Hi Chris
Klar kann ich die Programme auch aus meinem Programm aus starten mit WinExec(Programm1, SW_ShowNormal); und dann nochmal mit Programm2 aber was hilft mir dass wenn ich sie nicht abschießen kann ?? Kosta :? :?: |
Hi Chris
Um ganz genau zu sein. Ich habe das zweifelhafte Vergnügen EDV-Bereitschaftsdienst machen zu müssen. Die beiden Programme sind mein Krankenhaus-System das HL7-Dateien für Laboraufträge an mein Labor-System schickt; und das Labor-System schickt die fertigen Befunde wieder via HL7 zurück. Ich habe 2 Ordner HL7_IN und HL7_OUT dort werden je nach System die Dateien reingestellt. mein Programm schaut zur Zeit in beiden Ordnern nach ob dort eine Datei nicht abgeholt wurde. Wenn im jeweiligen Ordner eine Datei länger steht bekomme ich eine Mail/SMS geschickt - und dann kann ich mich ins Auto setzen und muß ins Krankenhaus fahren den Taskmanager aufrufen den stehenden Prozess beenden und neu starten. Kosta |
Hallo Kosta,
vielleicht kann ich auch helfen. Ich habe mal so ein ähnliches Problem bearbeitet. Auf einem laufenden Rechner habe ich geprüft ob ein Task läuft oder nicht. Wenn nicht habe ich ihn automatisch gestartet. Das habe ich auch mal mit einem Neustart des Rechners verbunden. Leider kann ich dir auf das Problem des stehenden Task auch keine bessere Antwort geben. Aber ich denke die vorherigen Vorschläge sind nicht schlecht. Übriegens reicht für das Beenden des Task der Name föllig aus. Der Rest ist dann schon machbar. Also wenn ich helfen kann, dann kurz melden. Gruß Olaf :lol: |
Zitat:
Ist es möglich, dass nur deine Anwendung die beiden Programme startet. Also der Autostart von dir ausgeht und nicht von Windows (Startmenü/Autostart, Registry). Dann kannst du nämlich mit CreateProcess die Prozess- und Hauptthread-Handles festhalten und mit EnumThreadWindows() das Hauptfenster ermitteln. |
hi jbg
Leider muss ich die beiden anderen Programme im Autostart lassen - sonst meinen die beiden verantwortlichen Firmen - lieber Kosta e klar das passiert alles weil dein Programm unsere Programme startet. erst dann wenn ich sie abgeschossen habe kann ich sie aus meinem programm starten. Gibt es keine Routine, die mir bei übergabe des Prozessnamen sagt ob dieser noch reagiert und eine andere Routine, die den Prozess abschießt ? Kosta :smile2: |
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Kosta,
hier mal was zum probieren. Der Code ist aber auch nicht auf meinem Mist gewachsen. Mit den Aufrufen in diesem Code kannst Du Dir dann deine eigene Überwachung aufbauen. Für den Notfall schlage ich folgenden Weg vor (zur Zeit ist ja nichts besseres zur Hand) - prüfe nach bisherigem Verfahren ob deine Textdateien nicht mehr abgeholt werden, - wenn das zutrifft ermittel mit den mitgelieferten Methoden den betreffenden Task (durchsuche die Taskliste nach dem betreffenden Programnamen) - danach beende den Task mit TerminateProcess - warte einige Zeit und sehe nach ob der Process weg ist - danach starte den Task neu mit CreateProcess Gruß Olaf |
Hallo Olaf
Danke für Deinen Tip. Kannst Du aber bitte den Source bzw. Link noch mal reinstellen Danke Kosta :lol: |
Was ist das im Anhang zu oki's Posting?
|
Hi Luckie
Ich weiß es nicht Kosta |
Na dann lad es dir mal runter und kuck es dir an.
|
Hi luckie
:oops: :oops: :oops: :oops: :oops: hab erst jetzt verstanden, dass man eingeloggt sein muss um attachements zu sehen :oops: :oops: :oops: :oops: :oops: Kosta |
Hallo Kosta,
konntes Du was mit dem Anhang anfangen? Wenn ich weiterhelfen kann melde dich kurz. Wie gesagt, ich habe zu speziellen Problemen auch eigenen Code zu diesem Thema geschrieben. Gruß Olaf |
Hi Olaf
Wollte mir den Source ansehen beim Compile hat er dann gemeint dass 'HeadList.dcu' fehlt. Die Exe sieht recht cool aus es wird ziemlich viel angezeigt. Aber du hast gemeint, dass Du auch einen eigenen Code hast wenn der nach dem Prinzip funktioniert: Übergabe Programm.exe Rückgabe läuft läuft nicht reagiert reagiert nicht wäre es lieb von dir wenn du ihn mir zur verfügung stellen kannst. :coder: Kosta |
Hallo Kosta,
leider habe die entsprechenden Quellen erst nächste Woche wieder im Zugriff (Firma). Ich sende sie dir dann aber gleich zu. Als Tip noch folgendes: Lasse Dir trotzdem deine SMS von Deinem neuen Programm uber alles was es macht zusenden. Automatische Tools machen manchmal automatisch mehr als sie sollen und zum Schluß muß mann irgentjemandem erklären warum man sich auf irgentwas verlassen hat. (Bittere Erfahrung) Es ist immer gut zu wissen was läuft. Gruß Olaf |
Hi Olaf
Danke für den Tip - mein Prog protokolliert jetzt schon im Minutentakt jedes Ereignis mit und wenn es mit den Tasks hinhaut kann ich den gesamtzustand des System genau nachvolziehen Kosta :lol: |
Hallo Kosta,
damit nichts in den falschen Hals kommt, ob der Tsk reagiert hab ich auf die Schnelle auch nicht rausbekommen. Ich schaue nur ob er da ist!!! Dort muß Du sicher die vorher beschriebenen Methoden nutzen. Mit meinem Ansatz bekommst Du nur Zugriff auf den Task und kannst ihn von außen terminieren!!! Neustart geht ja einfach über CreateProcess. Ich hoffe ich das ist jetzt kein Tiefschlag. Gruß Olaf |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:14 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