| Autor |
Beitrag |
mindtrap
      
Beiträge: 62
|
Verfasst: So 04.05.08 00:25
Hi,
ich wollte wissen, ob mir jemanden einen Tipp zu folgendem Problem geben kann:
Aus einem laufenden Programm heraus, möchte ich einen externen Prozess starten, der mein Programm überwacht.
Der Hintergrund dazu ist, dass das Hauptprogramm viele Operationen ausführt und manchmal länger auf Rückgabewerte warten muss. Gleichzeitig besteht eine Verbindung zu einem Server, der verschiedene Kontrollcodes an den "Client" sendet.
Diese können aber nicht immer zeitgemäß beantwortet werden und so kommt es zu einem Timeout, obwohl das Programm noch läuft.
Der Monitor übernimmt also die Aufgabe zwischen Server und Client zu vermitteln (Middleman) und ggf. zu signalisieren, dass der Client arbeitet (und somit einen Timeout verhindern soll).
Ich weiß zwar, dass ich ein eigenes Programm mit zusätzlich ausführen könnte (zweite Exe für den Monitor), aber das möchte ich eigentlich nicht, denn ein eigener, aus meinem Hauptprogramm heraus gestarteter, Prozess wäre mir da lieber.
Evtl. hat ja jemand 'nen Idee oder einen anderen Lösungsvorschlag.
Gruß
|
|
Silas
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: So 04.05.08 08:09
Moin,
teil dein Programm doch in zwei Threads auf, dann kannst du dir einen zweiten Prozess sparen.
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 04.05.08 19:58
Wie Silas das schon bereits sagte, wäre hier die Verwendung einer Multi-Thread-Architektur sicherlich das Sinnvollste.
Dabei solltest Du eine Gliederung etwa wie folgt vornehmen:
- Haupt-Anwendung:
Kümmert sich um Benutzereingaben
- Server-Kommunikation:
Kümmert sich um die Kommunikation mit deinem Server, Entgegennahme von Befehlen, Antwort auf diese
- Verarbeitung \ Processing:
Bearbeitet die Befehle, die in einer Warteschlange (FIFO) aufgereit sind und signalisiert diese, sobald diese abgearbeitet sind.
- Watchdog:
Will in regelmäßigen Abständen von den überwachten Threads (Komm und Processing) gestreichelt werden, ansonsten meldet er eine Exception.
Der Watchdog kann hierbei ein einfacher Thread sein, der einfach jede Sekunde prüft, ob ein bestimmter Wert im RAM sich geändert hat, der vom Watchdog in regelmäßigen Abständen inkrementiert wird. Zum Streicheln muss dann nur der überwachte Thread diesen Wert synchronisiert auf 0 setzen. Wird hierbei ein Wert überschritten, gilt der entsprechende Thread als abgeschmiert \ inkonsistent \ fehlerhaft und ein Fehler wird gemeldet.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
mindtrap 
      
Beiträge: 62
|
Verfasst: Do 08.05.08 15:13
Danke für die Tipps.
Ich werde noch prüfen müssen, ob ich mir das Auslagern in einen eigenen Prozess sparen kann.
Trotzdem würde mich interessieren, wie ich aus einem laufenden Prozess einen autarken, weiteren Prozess erstellen kann.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 08.05.08 15:19
Übersetz einfach mal ins Englische:
"Erzeuge Prozess" und drück F1 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
mindtrap 
      
Beiträge: 62
|
Verfasst: Mo 12.05.08 19:44
Laut dict.leo.org
[erzeuge]
engender
fabricate
generate
originate
manufacture
produce
[prozess]
action
proceedings
task
court case
In der Hilfe konnte ich nichts leider nichts finden.
Hab alles kombiniert.
Nur 'n Spaß.
Meine Frage zielte eher auf einen autarken Prozess ab.
Ich hatte in Erinnerung, dass CreateProcess als Parameter eine Binary erwartet, die ausgeführt wird.
Mein Plan war aber eher ein eigener Thread, der aus dem Mainprogramm herausgestartet wird, aber vom
Hauptprogramm unabhängig ist. (also ein eigener Prozess)
Ich werd einfach mal durchlesen, wie CreateProcess funktioniert und welche Thread-Prozessfunktionen es noch so alles gibt. Evtl. brauch ich es auch garnicht mehr.
Und btw. die Hauptapplikation ist Multithreaded, evtl. verwerfe ich den Gedanken mit dem Monitor, wenn ich einen anderen Weg finde. Interessieren würde mich aber trotzdem, wie die Theorie dazu aussehen würde.
merci~
|
|
gispos
      
Beiträge: 94
WIN 7
XE10, D2007
|
Verfasst: Mi 14.05.08 01:00
mindtrap hat folgendes geschrieben: |
Mein Plan war aber eher ein eigener Thread, der aus dem Mainprogramm herausgestartet wird, aber vom
Hauptprogramm unabhängig ist. (also ein eigener Prozess)
merci~ |
Dann doch mit CreateProcess, mußt dann nämlich eine extra Exe starten, weil..
Ein Nebenthread ist immer von der Anwendung (Hauptthread) abhängig!
Gruß gispos
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mi 14.05.08 01:40
mindtrap hat folgendes geschrieben: | Mein Plan war aber eher ein eigener Thread, der aus dem Mainprogramm herausgestartet wird, aber vom
Hauptprogramm unabhängig ist. (also ein eigener Prozess) |
Alter Unixer, was? fork() mag zwar so funktionieren, unter Windows ist da aber einiges anders 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
|