Forum: PC-Programmierung VB 2010: Pausenfunktion programmiert, wo liegt der fehler


von Christoph (Gast)


Lesenswert?

Hallo,

ich brauche in meinem Programm eine Pausenfunktion, da ich Digitale 
Ausgänge ein und ausschalte.

Habe es so probiert, allerdings wird meine eingegebene Pausenzeit nicht 
eingehalten, es ist immer viel kürzer.

Habe ein Modul erstellt:

Public Sub Delay(nSekunden As Long)
Dim TimeOut As Long

TimeOut = (GetTickCount / 1000) + nSekunden
Do
    Application.DoEvents

    Loop Until TimeOut < (GetTickCount / 1000)

End Sub


Was mache ich flasch?

von Sven H. (dsb_sven)


Lesenswert?

Was macht denn GetTickCount?

Und, versuch mal
1
Thread.Sleep(nSekunden * 1000)

von Christoph (Gast)


Lesenswert?

Achso, GetTickCount macht folgendes:

Public Declare Function GetTickCount Lib "kernel32" () As Long

von Sven H. (dsb_sven)


Lesenswert?

Also vermutlich wird die Anzahl der Ticks seit anno irgendwann zurück 
gegeben.

Nichtsdestotrotz würde ich den Thread.Sleep(int) Aufruf verwenden.

Allerdings weise ich noch darauf hin, dass beide Varianten nicht genauer 
als 9 bis 11 Millisekunden arbeiten. Das liegt an der Vergabe der 
Timeslots vom Betriebssystem. (glaub ich zumindest)

von Sven P. (Gast)


Lesenswert?

Oder mal das Programm aufräumen, meistens sind Warteschleifen unnötig.

von info (Gast)


Lesenswert?

Sven H. schrieb:
> Also vermutlich wird die Anzahl der Ticks seit anno irgendwann zurück
> gegeben.
Die Anzahl Millisekunden seit der PC gestartet wurde. Läuft nach 49,7 
Tagen über, aber Windows stürzt eh vorher ab. ;-)

> Allerdings weise ich noch darauf hin, dass beide Varianten nicht genauer
> als 9 bis 11 Millisekunden arbeiten. Das liegt an der Vergabe der
> Timeslots vom Betriebssystem. (glaub ich zumindest)
Ich meine es waren 16 ms.

von Geist (Gast)


Lesenswert?

> Nichtsdestotrotz würde ich den Thread.Sleep(int) Aufruf verwenden.
Aha und warum? Ich sehe keine Gründe das Programm in dem Fall zu 
pausieren. Ich würde eher einen Timer laufen lassen und dessen Wert in 
einem Thread abfragen. Wird ein Zählerwert erreicht -> Signalpolarität 
ändern, fertig ist...

von Peter II (Gast)


Lesenswert?

Geist schrieb:
> Aha und warum? Ich sehe keine Gründe das Programm in dem Fall zu
> pausieren. Ich würde eher einen Timer laufen lassen und dessen Wert in
> einem Thread abfragen. Wird ein Zählerwert erreicht -> Signalpolarität
> ändern, fertig ist...

na das ist ja umständlich - soetwas wird üblicherweise mit einem Sleep 
und einen Thread gemacht.

von Christoph (Gast)


Lesenswert?

Hab es jetzt mit Thread.Sleep gemacht, funktioniert, danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.