Forum | | | | - 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 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! |
| | | | |
| | 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. |
| | | | |
| | 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 {$iq}
Declare dh&,x&,y&,z&,thread&
Cls
If 0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AsmStart StartClock(x&)
.data
hwnd dd 0
vthread dd 0
.data?
uhrtext db 24 dup(?)
.code
m2m hwnd,para1
jmp start
thread:
szText komm, - eine permanente Uhr.
.while 1
invoke GetTimeFormat,0,0,0,0,addr uhrtext,20
invoke lstrcat,addr uhrtext,addr komm
invoke SendMessage,hwnd,WM_SETTEXT,0,addr uhrtext
invoke Sleep,1000
.endw
start:
invoke CreateThread,0,0,addr thread,0,0,addr vthread
AsmEnd
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AsmStart StopClock(x&)
invoke TerminateThread,para1,STILL_ACTIVE
AsmEnd
EndIf
thread&=Call(xpia_getprocaddressm(xpia_hmodule&,StartClock),%hwnd)
Print %hwnd
Whileloop 20000
Print Int(Rnd(100000))
EndWhile
Call(xpia_getprocaddressm(xpia_hmodule&,StopClock),thread&)
Print
Demo Ende.
Waitinput
End
|
| | | | |
| | Frank Abbing | Das gleiche in reinem Profan, nur mit TimerProc anstelle eines eigenen Threads: KompilierenMarkierenSeparierenDEF SetATimer(4) !USER32,SetTimer
DEF KillATimer(2) !USER32,KillTimer
DEF GetTimeFormat(6) !KERNEL32,GetTimeFormatA
Proc timerproc
Declare text$
text$=Space$(20)
GetTimeFormat(0,0,0,0,Addr(text$),20)
text$=Uhrzeit: +text$
SetText %hwnd,text$
EndProc
Cls
SetATimer(%hwnd,1,1000,ProcAddr(timerproc,0))
Whileloop 20000
Print Int(Rnd(100000))
EndWhile
Print
Demo Ende.
Waitinput
KillATimer(%hwnd,1)
End
|
| | | | |
| | 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! |
| | | | |
| | |
| | | | |
|
AntwortenThemenoptionen | 2.260 Betrachtungen |
ThemeninformationenDieses Thema hat 5 Teilnehmer: |