Forum | | | | 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) |
| | | | |
| | 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 ...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... |
| | | | |
| | 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. |
| | | | |
| | 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. |
| | | | |
| | 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 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 ▲ |
| |
|
AntwortenThemenoptionen | 2.263 Betrachtungen |
ThemeninformationenDieses Thema hat 5 Teilnehmer: |