Deutsch
Forum

Erledigt: 2 Sachen gleichzeitig ablaufen lassen

 

Jac
de
Lad
Hm, ich weiß gar nicht, wo ich anfangen soll...

Mein Problem ist folgendes: Ich habe ein Programm, dass neben dem normalen Ablauf auch die ganze Zeit (einmal pro Sekunde aktualisiert) die Uhrzeit und den Speicherverbrauch in der Statusbar anzeigen soll. Ich habs bisher mit der Thread.pcu gemacht. Aber iF rät davon ab, zurecht. Gaaaaanz selten kommt es vor, dass beim Beenden zu einer Fehlermeldung kommt, weil die benötigte Bereichsvariable schneller disposed wird als der Thread beendet wird (genau gesagt wird jede Sekunde eine Meldung erzeugt, die dann den Bilschirm füllen).

So, nun hat der iF gesagt, dass die PCU überflüssig ist, da es ja in XProfan 11 Subclassing gibt. Und er hat sich auch alle Mühe gegeben mir das zu erklären, aber ich habs nicht verstanden. Deshalb mal die Frage: Hat jemand vielleicht ein Beispiel für ein Programm, das entweder im Waitinput steckt (zum Beispiel ein anklickbarer Button) und über 2 Funktionen irgendwas ausgibt oder eine andere?

Jac
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
27.03.2008  
 



Ich glaube die Test4.Prf aus dem ProgressControl-Paket tut sowas...

Nachtrag: 2 Sachen gleichzeitig ablaufen lassen wenn Du das ernst meinst dann benötigst Du einen 2. Prozess da imho threads in XProfan sonst nur wieder procaddr-Probleme aufwerfen. (wenn überhaupt möglich)
 
27.03.2008  
 




Andreas
Miethe



KompilierenMarkierenSeparieren
#############################
XProfan11 RC2 Beispiel
Andreas Miethe, 28.03.2008
#############################
 $H Windows.ph
 $H Messages.ph
 $H Structs.ph
Struct MEMORYSTATUS = ~MEMORYSTATUS
Var Ende& = 0
CLS ~GetSysColor(~COLOR_BTNFACE)
SubClass %hwnd,1 SubClassing einschalten
Var Statusbar& = Create(StatusWindow,%hwnd,)
UpdateStatus(Statusbar&)
SubClass StatusBar&,1 SubClassing einschalten
~SetTimer(StatusBar&,1,1000,0)Timer an die Statusbar hängen
Var Button& = Create(Button,%hwnd,Warte auf Aktion,10,10,120,24)
SendMessage(Button&,~WM_SETFONT,~GetStockObject(~ANSI_VAR_FONT),1)
##########################################

Whilenot Ende&

    Waitinput

    If Clicked(Button&)

        ~KillTimer(StatusBar&,1)
        Ende& = 1

    Endif

EndWhile

SubClass StatusBar&,0
SubClass %hwnd,0
End
##########################################

Proc UpdateStatus

    Parameters Statusbar&
    Declare MemStatus#
    Dim Memstatus#,MEMORYSTATUS
    MemStatus#.dwLength& = SizeOf(MemStatus#)
    ~GlobalMemoryStatus(MemStatus#)
    SetText Statusbar&,Jetzt : +Time$(0)+:+Left$(Time$(1),2)+  -  Speicherverbrauch : +Str$(MemStatus#.dwMemoryLoad&)+%
    Dispose MemStatus#

EndProc

SubClassProc

    If SubClassMessage(%hwnd, ~WM_SIZE)

        SetWindowPos Statusbar& = 0,0-0,0

    ElseIf SubClassMessage(Statusbar&, ~WM_TIMER)

        UpdateStatus(&sWnd)

    Endif

EndProc

 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
28.03.2008  
 




Jac
de
Lad
@Andreas: So hatte ich mir das auch gedacht. Stell dir vor, dass der Button was x-beliebiges macht wie...
KompilierenMarkierenSeparieren
whileloop 0,10000000

    SetTExt button&,Str$(&Loop)
    Sleep 10

endwhile


...so klappt es nicht.
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
28.03.2008  
 



Hatten wir doch schon...

Du wirst in Deinem Loop auch UpdateStatus(&sWnd) aufrufen müssen!

Baue Dir eine helferProc welche updateStatus nur aufruft wenn z.B. 200 Millisekunden vergangen sind...
 
28.03.2008  
 




Jac
de
Lad
Ich versteh nur nicht, warum die Thread.pcu das automatisch macht und es keine andere Möglichkeit dafür gitb. Jedenfalls keine, die funktioniert und die ich verstehe.
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
28.03.2008  
 




Andreas
Miethe


Das wird auch nicht wirklich helfen! Wird ja nur die Statusbar upgedatet.
Der Rest des Programms hängt in der Schleife, solange sie nicht abgelaufen ist.
Das hilft nur ein Thread wriklich weiter.

Ich mach da mal ein Beispiel fertig !
Hab da schon eine Idee im Hinterkopf wie man das anstellen könnte. Ohne Callbacks und ProcAddr !
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
28.03.2008  
 




Jac
de
Lad
Vielen Dank im Voraus.
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
28.03.2008  
 



Nein einfacher - ich nehme Deinen Code für ein Beispiel:
KompilierenMarkierenSeparieren
#############################
XProfan11 RC2 Beispiel
Andreas Miethe, 28.03.2008
#############################
 $H Windows.ph
 $H Messages.ph
 $H Structs.ph
Struct MEMORYSTATUS = ~MEMORYSTATUS
Var intervalProcData&=&getTickCount
Var Ende& = 0
CLS ~GetSysColor(~COLOR_BTNFACE)
SubClass %hwnd,1SubClassing einschalten
Var Statusbar& = Create(StatusWindow,%hwnd,)
SubClass StatusBar&,1SubClassing einschalten
~SetTimer(StatusBar&,1,1000,0)Timer an die Statusbar hängen
Var Button& = Create(Button,%hwnd,Warte auf Aktion,10,10,120,24)
SendMessage(Button&,~WM_SETFONT,~GetStockObject(~ANSI_VAR_FONT),1)
##########################################

Whilenot Ende&

    Waitinput

    If Clicked(Button&)

        EnableWindow Button&,0

        WhileLoop 20000 heidy, ein könnte länger dauern loop?

            intervalProc()drum hier auch?! im Programm verteilen wo nötig!
            SetText Button&,str$(&getTickCount)
            ...

        EndWhile

        EnableWindow Button&,1
        ~KillTimer(StatusBar&,1)
        Ende& = 1

    Endif

EndWhile

SubClass StatusBar&,0
SubClass %hwnd,0
End
##########################################

Proc UpdateStatus

    Parameters Statusbar&
    Declare MemStatus#
    Dim Memstatus#,MEMORYSTATUS
    MemStatus#.dwLength& = SizeOf(MemStatus#)
    ~GlobalMemoryStatus(MemStatus#)
    SetText Statusbar&,Jetzt : +Time$(0)+:+Left$(Time$(1),2)+  -  Speicherverbrauch : +Str$(MemStatus#.dwMemoryLoad&)+%
    Dispose MemStatus#

EndProc

SubClassProc

    If SubClassMessage(%hwnd, ~WM_SIZE)

        SetWindowPos Statusbar& = 0,0-0,0

    ElseIf SubClassMessage(Statusbar&, ~WM_TIMER)

        intervalProc()

    Endif

EndProc

Proc intervalProc

    if intervalProcData&<&getTickCount

        intervalProcData&=intervalProcData&+200 MILLISEKUNDEN
        hier würd getüddelt
        UpdateStatus(%hWnd)
        UpdateStatus(StatusBar&)

    EndIf

EndProc


Reagiert wie Jac es wünscht und ist Ressourcen/Aufwand-sparender und gezielter einsetzbar als ein 2. (künstlicher) Thread der für so etwas garnicht wirklich nötig ist.

1.018 kB
Hochgeladen:28.03.2008
Ladeanzahl83
Herunterladen
 
28.03.2008  
 




Jac
de
Lad
@iF: Warum verstehst du das denn nicht? Ich kenne die Lösung bereits, wir haben schon zigmal darüber geredet. Aber ich dachte an etwas ohne IntervalProc, so wie es die Thread.pcu momentan macht...
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
28.03.2008  
 



Und genau das ist der Punkt wo ich genaustens Verstehe was Du gerne hättest, ich es aber nicht schaffe Dir zu erklären das es im Ergebnis das Selbe ist mit dem Vorteil: Gezielter einsetzbar und ressourcenschonender und vor allem: sicher. Es ist sozusagen eine Frage des Ablaufverständnisses - ich wüsste nicht wie ich es noch anders verständlich machen kann.
 
28.03.2008  
 




Andreas
Miethe


IntervalProc kam zu spät

Schon fertig mit dem Beispiel.

Erklärung dazu. Es werden 2 Datein benötigt, Einmal das eigentliche Programm, zum anderen das was den Loop enthält.
Der Loop-Programm muss kompiliert sein.
Das Hauptprogramm startet sich einfach selber mit Parametern (Loop-Programm) neu. Das Ganze funktioniert nur wenn beide Programme kompiliert sind !

Ist vielleicht noch verbesserungswürdig, funktioniert aber erstmal !

Loop-Programm ( als timer.prf speichern und kompilieren )
KompilierenMarkierenSeparieren
Als Timer.prf speichern und kompilieren !
 $H windows.ph

If %parCount > 0

    Declare WND&
    Var X& = 0
    WND& = Val(Par$(2))

    whileloop 0,1000000

        If X& = 0

            UseCursor 0
            X& = 1

        Endif

        ~InvalidateRect(wnd&,0,0)
        SetText Wnd&,Str$(&Loop)
        Sleep 10

    endwhile

Endif


Hauptprogramm
KompilierenMarkierenSeparieren
#########################################
Thread starten, pausieren lassen, beenden
Andreas Miethe 28.03.2008
#########################################
BEACHTE : starten als EXE oder STRG+F8
#########################################
 $IFDEF Compiler
 $H Windows.ph
 $H Structs.ph
 $H Messages.ph
Struct StartupInfo = ~STARTUPINFO
Struct ProcessInfo = ~PROCESS_INFORMATION
Struct MEMORYSTATUS = ~MEMORYSTATUS
Var Ende& = 0
cls ~GetSysColor(~COLOR_BTNFACE)
Declare ProcessHandle&,Processhandle1&
Declare ThreadHandle&,Threadhandle1&

Proc CreateThread

    Parameters Param$
    Declare StartupInfo#,CommandString$,ProcessInfo#
    Declare Retval&,Processhandle&,ThreadHandle&
    CommandString$ = Par$(0) +   + Param$
    Dim StartupInfo#,StartupInfo
    Clear StartupInfo#
    StartupInfo#.cb& = SizeOf(StartupInfo#)
    Dim ProcessInfo#,ProcessInfo
    Clear ProcessInfo#
    ~CreateProcess(0,Addr(CommandString$),0,0,0,0,0,0,StartupInfo#,ProcessInfo#)
    ProcessHandle& = ProcessInfo#.hProcess&
    ThreadHandle&  = ProcessInfo#.hThread&
    Dispose StartupInfo#
    Dispose ProcessInfo#
    Return Str$(ProcessHandle&)+,+Str$(ThreadHandle&)

EndProc

Proc TerminateThread

    Parameters ProcessHandle&
    Declare ExitCode&
    ~GetExitCodeProcess(Processhandle&,Addr(ExitCode&))
    ~TerminateProcess(Processhandle&,ExitCode&)

EndProc

Proc PauseThread

    Parameters Threadhandle&
    ~SuspendThread(Threadhandle&)

EndProc

Proc ResumeThread

    Parameters Threadhandle&
    ~ResumeThread(Threadhandle&)

EndProc

Var Handles$ =
Var Start& = Create(Button,%hwnd,Start,10,10,80,24)
Var Pause& = Create(Button,%hwnd,Pause,10,40,80,24)
Var Resume& = Create(Button,%hwnd,Fortsetzen,10,70,80,24)
Var Terminate& = Create(Button,%hwnd,Ende,10,100,80,24)
Var Empfang& = Create(TEXT,%hwnd,,10,130,80,24)
SendMessage(Start&,~WM_SETFONT,~GetStockObject(~ANSI_VAR_FONT),1)
SendMessage(Pause&,~WM_SETFONT,~GetStockObject(~ANSI_VAR_FONT),1)
SendMessage(Resume&,~WM_SETFONT,~GetStockObject(~ANSI_VAR_FONT),1)
SendMessage(Terminate&,~WM_SETFONT,~GetStockObject(~ANSI_VAR_FONT),1)
SendMessage(Empfang&,~WM_SETFONT,~GetStockObject(~ANSI_VAR_FONT),1)
EnableWindow Pause&,0
EnableWindow Resume&,0
EnableWindow Terminate&,0
Var Statusbar& = Create(StatusWindow,%hwnd,)
UpdateStatus(Statusbar&)
SubClass StatusBar&,1SubClassing einschalten
~SetTimer(StatusBar&,1,1000,0)Timer an die Statusbar hängen
SubClass %hwnd,1SubClassing einschalten
UserMessages ~wm_close

WhileNot Ende&

    Waitinput

    If Clicked(Start&)

        Die Exe startet sich selber noch einmal mit Parametern
        der Parameter, der hier erwartet wird ist ein ein Kompilat ( PRC-Datei )
        Handles$ = CreateThread(Timer.prc +str$(Empfang&))
        ProcessHandle1& = Val(Substr$(Handles$,1,,))
        ThreadHandle1& = Val(Substr$(Handles$,2,,))
        EnableWindow Pause&,1
        EnableWindow Terminate&,1
        EnableWindow Start&,0

    Elseif Clicked(Pause&)

        PauseThread(ThreadHandle1&)
        EnableWindow Pause&,0
        EnableWindow Resume&,1

    ElseIf Clicked(Resume&)

        ResumeThread(ThreadHandle1&)
        EnableWindow Pause&,1
        EnableWindow Resume&,0

    ElseIf Clicked(Terminate&)

        EnableWindow Pause&,0
        EnableWindow Resume&,0
        EnableWindow Terminate&,0
        EnableWindow Start&,1
        TerminateThread(ProcessHandle1&)

    Endif

    If %Umessage = ~wm_close

        wenn TerminateThread() nicht bei Programmende aufgerufen wird,
        läuft das 2.Programm weiter !
        TerminateThread(ProcessHandle1&)
        Ende& = 1

    Endif

EndWhile

SubClass StatusBar&,0
SubClass %hwnd,0
end

Proc UpdateStatus

    Parameters Statusbar&
    Declare MemStatus#
    Dim Memstatus#,MEMORYSTATUS
    MemStatus#.dwLength& = SizeOf(MemStatus#)
    ~GlobalMemoryStatus(MemStatus#)
    SetText Statusbar&,Jetzt : +Time$(0)+:+Left$(Time$(1),2)+  -  Speicherverbrauch : +Str$(MemStatus#.dwMemoryLoad&)+%
    Dispose MemStatus#

EndProc

SubClassProc

    If SubClassMessage(%hwnd, ~WM_SIZE)

        SetWindowPos Statusbar& = 0,0-0,0

    ElseIf SubClassMessage(Statusbar&, ~WM_TIMER)

        UpdateStatus(&sWnd)

    Endif

EndProc

 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
28.03.2008  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.263 Betrachtungen

Unbenanntvor 0 min.
Tango14.07.2017
Ernst02.03.2015
iF19.05.2013
Juergen Baier15.02.2012

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