Deutsch
Forum

Erledigt: 2 Sachen gleichzeitig ablaufen lassen

 
- Seite 1 -



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  
 



 
- Seite 1 -



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  
 



 
- Seite 2 -



Jac
de
Lad
Aber hier werden 2 Programme benötigt, das ist Mist.
 
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  
 



Aber vielleicht ist es grade deshalb nochmal ein Denkanstoß das ein echter 2. Thread für Deine Vorhaben (egal wie verpackt) einfach uneffizient ist, mal unabhängig davon das Andreas da eine super Prozessverpackung vormacht die kopiert nach Codesnippets gehört!
 
28.03.2008  
 




Jac
de
Lad
Sagen wirs mal so: Ich sehe das ein. Aaaaaaber, ich kann in mein Prog nicht 500 SetStatus() einbauen.
 
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  
 




Jörg
Sellmeyer
Von Uwe Pascal Niemeyer (oder wars Sebastian König?) gab es mal ein Beispiel, in dem mit Assembler eine Uhr in der Statusbar gesteuert wird.
Ich habs jetzt nicht parat, aber vielleicht kannst Du ja mal auf seiner HP suchen.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
28.03.2008  
 




Frank
Abbing

Von Uwe Pascal Niemeyer (oder wars Sebastian König?) gab es mal ein Beispiel, in dem mit Assembler eine Uhr in der Statusbar gesteuert wird.
Ich habs jetzt nicht parat, aber vielleicht kannst Du ja mal auf seiner HP suchen.


Dort wird per Assembler ein Thread gestartet. Darin kann aber kein Profancode ablaufen. Jac, sowas ist mit XPIA sehr einfach möglich.
 
29.03.2008  
 




Jac
de
Lad
Hm...ich seh hier nich mehr durch...ich glaub ich lasses, is zu kompliziert nur für ne Uhr und ne Speicheranzeige...
 
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
29.03.2008  
 




Frank
Abbing
Hm, gerade dieses Beispiel Permanente Uhr ist doch bei XPIA dabei...
KompilierenMarkierenSeparieren

1.029 kB
Hochgeladen:29.03.2008
Ladeanzahl74
Herunterladen
 
29.03.2008  
 




Frank
Abbing
Das gleiche in reinem Profan, nur mit TimerProc anstelle eines eigenen Threads:
KompilierenMarkierenSeparieren
 
30.03.2008  
 




Jac
de
Lad
Genau sowas hab ich gesucht.
 
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
30.03.2008  
 



Jac
Genau sowas hab ich gesucht.


Genau sowas wird Dir sicher viel Freude bringen!
 
30.03.2008  
 



Jac de Lad, Beitrag=39020, Zeitpunkt=27.03.2008
Hm, ich weiß gar nicht, wo ich anfangen soll...

...

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

KompilierenMarkierenSeparieren

347 kB
Hochgeladen:28.10.2009
Ladeanzahl21
Herunterladen
 
26.10.2009  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.271 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