Deutsch
Forum

Zähler ohne Timer

 

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.
Cls
Declare Counter%

SubClassProc

    'If SubClassMessage(%hwnd,?)
    Inc Counter%

    If Counter% = 385

        Counter% = 1
        Cls

    EndIf

    'EndIf

EndProc

Subclass %hwnd,1
Screen 4000,500

While 1

    WaitInput
    WindowTitle Str$(Counter%)

    If IsKey($20)

        DrawText Counter% * 10,40,"!"

    ElseIf IsKey(27)

        Break

    EndIf

Wend

Subclass %hwnd,0
 
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:
Proc SetTitleTime

    parameters handle&
    var ende% = 0

    whilenot ende%

        setText handle&, dt("getdate", 6)
        case getText$(handle&) = "" : ende% = 1
        sleep 100

    endwhile

endproc

Randomize
windowstyle 24 + 512
Window 100,550-500,200
pExec("|SetTitleTime", %hWnd)
var ende% = 0

whilenot ende%

    waitinput
    case %key = 2 : ende% = 1

endwhile

end



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

1.373 kB
Hochgeladen:27.09.2011
Ladeanzahl26
Herunterladen
 
27.09.2011  
 



@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. ^^
 
27.09.2011  
 




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 X2
Intel 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!
 
27.09.2011  
 




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.
 
27.09.2011  
 




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?
 
28.09.2011  
 




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.
 
28.09.2011  
 




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  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.265 Betrachtungen

Unbenanntvor 0 min.
Tango14.07.2017
Jörg Sellmeyer03.12.2015
GDL03.09.2015
Peter Max Müller16.05.2015
Mehr...

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