Deutsch
Forum

Rückgabecode aus einer Pexec aufgerufenen Procedure

 

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.
 
XProfan X2
xprofan 9.0, windows xp pro
18.06.2014  
 




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
pid& = pExec(....)

if getExitCode(pid <> 259)

    print "läuft nicht mehr!     "

Endif


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.
 
XProfan X2
xprofan 9.0, windows xp pro
18.06.2014  
 




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.
 
XProfan X2
xprofan 9.0, windows xp pro
19.06.2014  
 




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.
KompilierenMarkierenSeparieren
Declare 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.
 
XProfan X2
xprofan 9.0, windows xp pro
19.06.2014  
 




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.
 
20.06.2014  
 




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 ?
KompilierenMarkierenSeparieren
Declare 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...)
KompilierenMarkierenSeparieren
Declare 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:
KompilierenMarkierenSeparieren
hfm& = @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  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

14.358 Betrachtungen

Unbenanntvor 0 min.
Rolf Koch26.11.2015
Nico Madysa18.12.2014
Georg Teles14.10.2014
Pedro Miguel04.10.2014
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie