| |
|
|
Jörg Sellmeyer | Hallo,
Wie könnte ich einen Zähler realisieren, der quasi mit voller Geschwindigkeit zählt, während mein Hauptprogramm im Waitinput auf eine Eingabe wartet? Mit folgendem kleinen Code steht der Zähler. Wenn ich aber die Maus bewege rast er los. Diese Geschwindigkeit bräuchte ich dauernd. Gibt es eine Message, die dauernd übermittelt wird? Ein Timer ist auf jeden Fall zu langsam.
|
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 27.09.2011 ▲ |
|
|
|
|
Nico Madysa | In XProfan X2 wäre das wohl mit Multiprozessing zu lösen.
RGH
So würde etwa die oft gefragte Zeit in der Titelzeile gelöst werden:
Ansonsten wären Threads eine Lösung. Habe mit XPSE und NProcs etwas hingezimmert bekommen, das etwa das macht, was du willst:
{$cleq}
Cls
nproc Timer
parameters addr&
whilenot Long(addr&,0) < 0
Sleep(1)
Long addr&,0 = Long(addr&,0) + 1
SetText %hWnd,str$(Long(addr&,0))
if Long(addr&,0) >= 385
Long addr&,0 = 0
BitBlt(%hDC,0,0,4000,500,%hDC,0,0,WHITENESS)
endif
wend
ExitThread(0)
EndProc
var id& = 0
var exit& = 0
declare count#
dim count#,4
CreateThread(0,0,ProcAddr(Timer,1),count#,0,Addr(id&))
Screen 4000,500
While 1
WaitInput
WindowTitle Str$(Long(count#,0))
If IsKey($20)
DrawText Long(count#,0) * 10,40,"!"
ElseIf IsKey(27)
Long count#,0 = -10
Break
EndIf
Wend
if GetExitCodeThread(id&,Addr(exit&)) = STILL_ACTIVE
whileloop 5
print "Thread noch aktiv ..."
Sleep 100
casenot GetExitCodeThread(id&,Addr(exit&)) = STILL_ACTIVE : break
EndWhile
case GetExitCodeThread(id&,Addr(exit&)) = STILL_ACTIVE : TerminateThread(id&,0)
endif
Dispose count#
end
Natürlich sind einige Dummejungenfehler drin, aber zumindest bei mir funktioniert es. Hier die Exe: Herunterladen externer Download |
|
|
| |
|
|
|
| @Jörg: Windows zählt bereits immer z.B. in getTickCount ^^ -
wenn Du Dir also zum Zeitpunkt X den getTickCount merkst dann kannst immer per Differenz ermittelt wie weit ("im Hintergrund") gezählt wurde.
Jörg Sellmeyer (27.09.11)
Diese Geschwindigkeit bräuchte ich dauernd. Gibt es eine Message, die dauernd übermittelt wird?
Noe -
das Programm wäre sonst auch "immer" busy. ^^ |
|
|
| |
|
|
|
RGH | Warum nicht mit einem eigenen Prozess:
Declare hFileMap&, Buffer#, Counter%
Dim Buffer#, 5' Platz für ein LongInt + 1 CLS-Flag
Proc Counter
' Eigener Prozess, daher kein globaler Variablenzugriff
Declare c_hFileMap&, c_Buffer#, c_Counter%
Dim c_Buffer#, 5' Platz für ein LongInt
c_hFileMap& = FileMap("Open", "Counter")
c_Counter% = 0
' Speicherdate existiert: los geht's mit Zählen
If c_hFileMap&
c_Buffer# = FileMap("Map", c_hFileMap&)
Long c_Buffer#, 0 = c_Counter%
Byte c_Buffer#, 4 = 0' CLS-Flag auf 0
While 1
Sleep 10' Für Testzwecke zum besseren Nachvollziehen
Inc c_Counter%
If c_Counter% = 385
c_Counter% = 1
Byte c_Buffer#, 4 = 1' CLS-Flag auf 1
EndIf
Long c_Buffer#, 0 = c_Counter%
EndWhile
Dispose c_Buffer#
FileMap("Close", c_hFileMap&)
Else
MessageBox("Speicherdatei konnte nicht geöffnet werden!", "MAP-Hinweis", 48)
EndIf
EndProc
CLS
Screen 4000,500
counter% = 0
hFileMap& = Create("FileMap", "Counter", 4)
If hFileMap&
Buffer# = FileMap("Map", hFileMap&)
Else
MessageBox("Speicherdatei konnte nicht erstellt werden!", "Hinweis", 48)
EndIf
' Speicherdatei ist vorbereitet: Der Prozess Conter kann gestartet werden
var hCounter& = PExec("|Counter")
While 1
WaitInput
Counter% = Long(Buffer#, 0)
If Byte(Buffer#, 4 = 1)
CLS
Byte Buffer#, 4 = 0' CLS-Flag zurücksetzen
EndIf
WindowTitle Str$(Counter%)
If IsKey($20)
DrawText Counter% * 10,40,"!"
ElseIf IsKey(27)
Break
EndIf
EndWhile
' Conter-Prozess beenden!
process("kill", hCounter&, 0)
Dispose Buffer#
FileMap("Close", hFileMap&)
End
Gruß Roland
EDIT: Da war jemand schneller, wenn auch etwas anders ... |
|
|
| XProfan X2Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 27.09.2011 ▲ |
|
|
|
|
| RGH (27.09.11)
Warum nicht mit einem eigenen Prozess:
Die Initialisierung ist leider sehr Systemlastig! |
|
|
| |
|
|
|
Nico Madysa | RGH (27.09.11)
Warum nicht mit einem eigenen Prozess:
Weil ich da die Adressen nicht so einfach hätte übergeben können. Ich habe den Code nur fix vor dem Mittagessen hingepinselt und wollte mich nicht noch in Filemaps einlesen. Aber so, wie du's gemacht hast, geht's natürlich auch. |
|
|
| |
|
|
|
Jörg Sellmeyer | Ich hab's mir schon gedacht. Mal schaun, was sich da machen läßt. Ich hatte gehofft, das ließe sich (Dank Wunderwaffe Subclassing) in einem Programm erledigen. Danke für die Anregungen und Codes! |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 28.09.2011 ▲ |
|
|
|
|
| Wie wäre es mit Opcode an die createThread-API übergeben sodass Du an einer Speicherstelle immer einen Zählerwert hast? |
|
|
| |
|
|
|
Jörg Sellmeyer | Das sagt mir nix |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 28.09.2011 ▲ |
|
|
|
|
| Wie schnell soll denn gezählt werden? Ich nehme nicht an das Du mit 100% CPU-Last "zählen" möchtest weshalb ich das frage. Ich könnte dann z.B. einfach bisl nativen Opcode in einen Bereich schreiben und den per createThread zur Ausführung anweisen. |
|
|
| |
|
|
|
Jörg Sellmeyer | Ah ja. Ich glaube, daß mit dem Zählen funktioniert so schon. Im Moment nervt mich etwas Anderes. Melde mich wieder. |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 29.09.2011 ▲ |
|
|
|