Forum | | | | Bernd Lies | Hallo.
Leider plagt mich wieder ein Problem. In einem Hauptprogramm starte ich per Pexec eine parallel zum Hauptprogramm laufende Procedure. Irgendwann ist diese Procedure beendet und gibt eine Meldung per MessageBox aus. Wie kann ich jetzt im Hauptprogramm abfragen, ob die Procedure beendet ist. Der Grund: es müssen noch weitere Aktivitäten, bezogen auf die Ergebnisse der Procedure, im Hauptprogramm erfolgen.
Gibt es die Möglichkeit einen Parameter als Rückgabecode aus der aufgerufenen Procedure zu bekommen?
Wär toll wenn mir jemand seine Hilfe anbieten würde. |
| | | | |
| | H.Brill | Brauchst du nur in der Hilfe bei pExec() zu schauen. Natürlich mußt du die Prozess-ID (PID) haben. Die bekommst du, wenn du pExec() einen Wert zurückgeben läßt : KompilierenMarkierenSeparieren Wenn du getExitCode() in deiner Hauptprogrammschleife permanent abfragst, sollte es gehen.
Wenn du was von der Proc zurückgeben willst, kannst du das über FileMap lösen. Noch eine einfache Möglichkeit wäre das Clipboard. |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 18.06.2014 ▲ |
| |
| | Bernd Lies | Hallo H.Brill,
vielen Dank für Deine Antwort. Ich werde Deine Angaben austesten. Werde dazu aber erst in den nächsten Tagen kommen. Selbstverständlich werde ich über das Ergebnis informieren. |
| | | | |
| | Bernd Lies | Hallo H. Brill,
hier mein Ergebnis: Das mit der Prozess-ID hat nicht geklappt, aber dafür die Version mit dem Clipboard. Somit ist mein Problem gelöst. Vielen Dank für die Hilfe. |
| | | | |
| | H.Brill | Naja, kommt ganz drauf an, was du machen willst. Evtl. brauchst du auch das Clipboard gar nicht.
Anbei mal ein Beispiel, wie ein Prozess durch Übergabe eines Handle, eine Gridbox füllt.
Dabei wird auch die Prozess - ID abgefragt. KompilierenMarkierenSeparierenDeclare runp&, btn1&, btn2&, btn3&, btn4&, st&, lb&, pid&
Declare Memory b
Dim b, 4
Long b, 0 = 200
runp& = 0
WindowStyle 512 + 2 + 8
WindowTitle "Mein Fenster"
Window 600, 400
btn1& = @Create("Button", %HWnd, "Start", 10, 10, 60, 25)
btn2& = @Create("Button", %HWnd, "Stop", 100, 10, 60, 25)
btn3& = @Create("Button", %HWnd, "Clear", 190, 10, 60, 25)
btn4& = @Create("Button", %HWnd, "Ende", 280, 10, 60, 25)
lb& = @Create("Gridbox",%HWnd, "Spalte 1;0;120;Spalte 2;0;120;Spalte 3;0;120", 0, 10, 50, 400, 150)
st& = @Create("StatusWindow", %HWnd, "", 3, b)
pid& = pExec("|RunProzess", %HWnd, lb&)
If pid& <> 0
runp& = 1
EnableWindow btn1&, 0
SetText st&, 0, "Prozess läuft !"
EndIf
WhileNot @Clicked(btn4&)
WaitInput
If @Clicked(btn1&)
If runp& = 0
runp& = 1
pid& = pExec("|RunProzess", %HWnd, lb&)
SetText st&, 0, "Prozess läuft !"
EnableWindow btn1&, 0
Else
MessageBox("Prozess läuft bereits !", "Info", 0)
EndIf
ElseIf @Clicked(btn2&)
If runp& = 1
Process("Kill", pid&, 0)
EnableWindow btn1&, 1
runp& = 0
SetText st&, 0, "Prozess beendet !"
Else
MessageBox("Prozess läuft nicht !", "Info", 0)
EndIf
ElseIf @Clicked(btn3&)
ClearList lb&
EndIf
Case %Key = 2 : Break
If getExitCode(pid&) <> 259
SetText st&, 0, "Prozess läuft nicht mehr !"
EndIf
EndWhile
Dispose b
End
Proc RunProzess
Parameters win&, dlgwin&
Declare ende%
Clear ende%
WhileNot ende%
Randomize
AddString(dlgwin&, Str$(Rnd(100)) + "|" + Str$(Rnd(1000)) + "|" + Str$(Rnd(10000)) )
Sleep 2000
case getText$(win&) = "" : ende% = 1
EndWhile
EndProc
|
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 19.06.2014 ▲ |
| |
| | Bernd Lies | Dein Beispiel habe ich verstanden und getestet und in meine Codesammlung verschoben . Mein Problem war, das in dem Process eine Zeit abläuft, die irgend wann dann auf 0 geht. Wenn dieser Fall eintritt, musste ich das im Hptprg. wissen. Also einfach ein Flag ins Cipboard gesetzt und dann im Hptprg abgefragt. |
| | | | |
| | Nico Madysa | Nette Sache, aber was ist, wenn der Anwender in der Zwischenzeit die Zwischenablage selbst benutzt?
Meiner Einsicht nach wäre es sinnvoller, entweder a) eine Filemap zu verwenden (die XProfan-Hilfe weiß mehr) oder b) einfach vom Unterprozess eine Message an den Oberprozess zu senden.
Was hier die einfachere Möglichkeit ist müsste man einfach mal ausprobieren. |
| | | | |
| | H.Brill | zu a) Was ist, wenn ein anderes Programm läuft und dieses den gleichen Namen der Filemap benutzt ? Nr. b) finde ich dann am sinnvollsten.
Oder oben wie in meinem Code an das Handle eines Controls im Hauptprogramm senden. |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 20.06.2014 ▲ |
| |
| | H.Brill | Vielleicht läßt sich mit dem was anfangen. Wenn dein Prozess nicht zu lange dauert : KompilierenMarkierenSeparieren $H Windows.ph
Declare runp&, btn1&, btn2&, btn3&, btn4&, st&, lb&, pid&
Declare Memory b
Declare Grid&
Dim b, 4
Long b, 0 = 200
runp& = 0
WindowStyle 512 + 2 + 8
WindowTitle "Mein Fenster"
Window 600, 400
btn1& = @Create("Button", %HWnd, "Start", 10, 10, 60, 25)
btn2& = @Create("Button", %HWnd, "Stop", 100, 10, 60, 25)
btn3& = @Create("Button", %HWnd, "Clear", 190, 10, 60, 25)
btn4& = @Create("Button", %HWnd, "Ende", 280, 10, 60, 25)
lb& = @Create("Gridbox",%HWnd, "Spalte 1;0;120;Spalte 2;0;120;Spalte 3;0;120", 0, 10, 50, 400, 150)
st& = @Create("StatusWindow", %HWnd, "", 3, b)
Grid& = @Create("Grid", 1, 0)
pid& = pExec("|RunProzess", %HWnd, lb&, Grid&)
If pid& <> 0
runp& = 1
EnableWindow btn1&, 0
SetText st&, 0, "Prozess läuft !"
EndIf
WhileNot @Clicked(btn4&)
WaitInput
If @Clicked(btn1&)
If runp& = 0
runp& = 1
pid& = pExec("|RunProzess", %HWnd, lb&, Grid&)
SetText st&, 0, "Prozess läuft !"
EnableWindow btn1&, 0
Else
MessageBox("Prozess läuft bereits !", "Info", 0)
EndIf
ElseIf @Clicked(btn2&)
If runp& = 1
Process("Kill", pid&, 1000)
EnableWindow btn1&, 1
runp& = 0
SetText st&, 0, "Prozess beendet !"
Else
MessageBox("Prozess läuft nicht !", "Info", 0)
EndIf
ElseIf @Clicked(btn3&)
ClearList lb&
EndIf
Case %Key = 2 : Break
If getExitCode(pid&) = 1000
SetText st&, 0, "Prozess läuft nicht mehr !"
Messagebox(GetString$(Grid&, 0), "", 0)
EndIf
EndWhile
Dispose b
End
Proc RunProzess
Parameters win&, dlgwin&, g&
Declare ende%
Clear ende%
ClearList g&
WhileNot ende%
Randomize
AddString(dlgwin&, Str$(Rnd(100)) + "|" + Str$(Rnd(1000)) + "|" + Str$(Rnd(10000)) )
AddString(g&, "Astalavista !!!")
Sleep 2000
case getText$(win&) = "" : ende% = 1
EndWhile
EndProc
Zu überlegen wäre auch, wenn man Platz hat : Man erstellt zu Programmbegin ein Editfeld und macht es mit ShowWindow unsichtbar. Dessen Handle übergibt man dann dem Prozess, der dann mit SetText was reinschreibt. Wenn man dann im Hauptprogramm den Exitcode abfragt, könnte man doch mit GetText$() das Editfeld auslesen.
Müßte man mal ausprobieren. |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 20.06.2014 ▲ |
| |
| | E.T. | H.Brill (20.06.14)
zu a) Was ist, wenn ein anderes Programm läuft und dieses den gleichen Namen der Filemap benutzt ? ...
hm, wie wahrscheinlich ist ist diese Konstellation ...jaja, sag niemals nie...
Kollisionen könnte man ja auch umgehen, wenn man z.B. der Speicherdatei als Name die PID des erzeugenden Programms gibt (mach ich so), oder einen vom Programm generierten einzigartigen Name, oder, oder... Gibt es der Möglichkeiten viele, ich hatte da noch nie Probleme... |
| | | Grüße aus Sachsen... Mario WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte... | 21.06.2014 ▲ |
| |
| | H.Brill | Weißt du etwas mehr über Filemapping ? Warum geht folgendes Programm nur einmal bei Programmstart ? KompilierenMarkierenSeparierenDeclare runp&, btn1&, btn2&, btn3&, btn4&, st&, pid&
Declare Memory b
Declare m#
Declare hfm&
Dim m#, 1000
Dim b, 4
Long b, 0 = 300
runp& = 0
WindowStyle 512
Window 800, 600
btn1& = @Create("Button", %HWnd, "Start", 10, 10, 60, 25)
btn2& = @Create("Button", %HWnd, "Ende", 100, 10, 60, 25)
st& = @Create("StatusWindow", %HWnd, "", 3, b)
hfm& = @Create("Filemap", "Zahl", 1000)
WhileNot @Clicked(btn2&)
WaitInput
If @Clicked(btn1&)
If runp& = 0
runp& = 1
pid& = pExec("|RunProzess", %HWnd)
SetText st&, 0, "Prozess läuft !"
EnableWindow btn1&, 0
Else
MessageBox("Prozess läuft bereits !", "Info", 0)
EndIf
Case %Key = 2 : Break
EndIf
If getExitCode(pid&) <> 259
SetText st&, 0, "Prozess beendet"
runp& = 0
EnableWindow btn1&, 1
Clear m#
hfm& = FileMap("Open", "Zahl")
m# = FileMap("Map", hfm&)
FileMap("Close", hfm&)
SetText st&, 0, String$(m#, 0)
EndIf
EndWhile
Dispose b, m#
Proc RunProzess
Parameters win&
Declare mf&, ok&, a&, buffer#
Dim buffer#, 1000
mf& = FileMap("Open", "Zahl")
WhileLoop 1, 100
a& = &LOOP
case getText$(win&) = "" : Break
Sleep 10
EndWhile
buffer# = FileMap("Map", mf&)
String buffer#, 0 = Str$(a&) + " Schritte im Prozess verarbeitet !!!"
Dispose buffer#
ok& = FileMap("Close", mf&)
EndProc
End
Wenn ich den Button Start zum 2. Mal drücke, wird nichts mehr in der Statuszeile angezeigt. Auch muß ich erst mit der Maus ins Fenster klicken (wahrscheinlich durch waitinput).
Könnte man einen Klick simulieren ? |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 21.06.2014 ▲ |
| |
| | E.T. | Hab mal bissel gespielt (ExitCode des aufgerufenen Programms,Statuszeile, Anzeigen...) KompilierenMarkierenSeparierenDeclare runp&, btn1&, btn2&, btn3&, btn4&, st&, pid&, ec&
Declare b#
Declare m#
Declare hfm&, hfmx&
Dim m#, 1000
Dim b#, 12
Long b#, 0 = 200,500,-1
runp& = 0
WindowStyle 512
Window 800, 600
btn1& = @Create("Button", %HWnd, "Start", 10, 10, 60, 25)
btn2& = @Create("Button", %HWnd, "Ende", 100, 10, 60, 25)
st& = @Create("StatusWindow", %HWnd, "STATUS", 3, b#)
hfm& = @Create("Filemap", "Zahl", 1000)
WhileNot @Clicked(btn2&)
Waitinput 100
If @Clicked(btn1&)
If runp& = 0
locate 20,0
print " "
SetText st&, 1, "...warte"
runp& = 1
Clear pid&
' pid& = pExec("|RunProzess", %HWnd)
$IFDEF INTERPRETER
pid& = PExec("|RunProzess")
$ELSE
pid& = PExec("|RunProzess")
$ENDIF
SetText st&, 0, "Prozess läuft !"
EnableWindow btn1&, 0
Else
MessageBox("Prozess läuft bereits !", "Info", 0)
EndIf
Case %Key = 2 : Break
EndIf
If ec& = 777
SetText st&, 0, "Prozess beendet"
runp& = 0
EnableWindow btn1&, 1
hfmx& = FileMap("Open", "Zahl")
If hfmx&
m# = FileMap("Map", hfmx&)
FileMap("Close", hfmx&)
locate 20,0
print STRING$(m#,0)
SetText st&, 1, String$(m#,0)
Else
MessageBox("Speicherdatei konnte nicht geöffnet werden!", "MAP-Hinweis", 48)
EndIf
Clear ec&, pid&
EndIf
ec& = getExitCode(pid&)
SetText st&, 2, str$(pid&) + ", " + str$(ec&)
EndWhile
Dispose b#, m#
Proc RunProzess
Parameters win&
Declare mf&, ok&, a&, buffer#
Dim buffer#, 1000
mf& = FileMap("Open", "Zahl")
WhileLoop 1, 100
a& = &LOOP
' case getText$(win&) = "" : Break ????Nur ein durchlauf !!
Sleep 10
EndWhile
buffer# = FileMap("Map", mf&)
'String buffer#, 0 = Str$(a&) + " Schritte im Prozess verarbeitet !!!"
String buffer#, 0 = "Fertig : " + @dt("DateTimeStr", "c", !now)
Dispose buffer#
ok& = FileMap("Close", mf&)
End 777
EndProc
End
Bei'm auslesen und anzeigen hast du hfm& (die ID der Mapdatei) überschrieben: KompilierenMarkierenSeparierenhfm& = @Create("Filemap", "Zahl", 1000)
...
hfm& = FileMap("Open", "Zahl")
...
Habs einfach mal angepasst, und schon funzt es immer und immer wieder: KompilierenMarkierenSeparieren...
hfmx& = FileMap("Open", "Zahl")
...
...nebenbei eben mal einen Klick simuliert |
| | | Grüße aus Sachsen... Mario WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte... | 22.06.2014 ▲ |
| |
|
AntwortenThemenoptionen | 14.432 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |