2 mal Schleife behindern sich, was kann man tun?

Anfängerfragen zum Programmieren mit PureBasic.
Ractur
Beiträge: 128
Registriert: 24.06.2008 11:51

2 mal Schleife behindern sich, was kann man tun?

Beitrag von Ractur »

Hallo,

ich habe 2 Schleifen, eine Repeat Schleife die feststellt wie lange der Benutzer "IDLE" ist

Code: Alles auswählen

Repeat
container = IdleTime()
container/1000
   Debug container
   PrintN(Str(container))
   Delay(1000)
Until Left(Inkey(),1) = Chr(27)
und danach folgt die nächste Schleife, und zwar:

Code: Alles auswählen

Repeat
EventID = WaitWindowEvent()!
.............
ForEver
Allerdings behindert die eine Schleife nun die andere, was klar ist irgendwie. Allerdings frag ich mich wie ich das nun am besten Löse?

Soll ich 2 Programme draus machen? Oder kann man das andere als Quasi anderen Task ablaufen lassen? Oder gibt es die Möglichkeit die Schleifen "miteinander" zu "verbinden" keine Ahnung. Bin im Moment bisschen Ratlos, würde mich über einen Tip freuen.

Danke!
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Such mal Thread in der Hilfe.
Windows 11 - PB 6.03 x64
_________________________________
Ractur
Beiträge: 128
Registriert: 24.06.2008 11:51

Beitrag von Ractur »

Danke marco2006 das hat mir prima weitergeholfen :) :D
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: 2 mal Schleife behindern sich, was kann man tun?

Beitrag von Danilo »

Ractur hat geschrieben:Oder gibt es die Möglichkeit die Schleifen "miteinander" zu "verbinden" keine Ahnung.
Ich weiß nicht was Deine Funktion IdleTime() macht, aber hier mal ein
Beispiel wie man die 2 Schleifen zusammensetzen könnte.
In dem Beispiel benutze ich mal "idle" für den Zustand das keine
Fensterereignisse stattfinden, nur zur Demonstration. In Wirklichkeit
ist das ja nicht idle. "User idle" wäre wohl eher wenn keine Mausbewegungen
und -klicks sowie keine Tastatureingaben stattfinden.

Mit folgenden Pseudocode könntest Du ausrechnen wie lange die
Zeit zwischen den Ereignissen war. Dazwischen kannst Du aber
durch WaitWindowEvent() nichts machen.

Code: Alles auswählen

Repeat
  Datum1  = Date()
  EventID = WaitWindowEvent()
  Datum2  = Date()
  ; ausrechnen wieviel Zeit kein Event stattfand
ForEver
Die zweite Methode ist dann mit WindowEvent() ohne das Wait:

Code: Alles auswählen

Repeat
  EventID = WindowEvent()
  If Not EventID ; kein Event stattgefunden
    ; erhöhe internen idle-timer, z.b. auch mit Date() sekunden berechnen
    ; machwas mit dem wert
    Delay(20) ; kleine verzögerung, die nur aufgerufen wird wenn *kein*
              ; Ereigniss stattfand, sonst natürlich keine Verzögerung
  Else
    ; Ereignis stattgefunden, idle-timer auf 0 zurücksetzen
    Select EventID
      Case #PB_Event_CloseWindow
        break ; ForEver-Schleife beenden
    EndSelect
  EndIf
ForEver
Wie gesagt, das ist nur zur Demonstration wie man das zusammenlegen
könnte. Um herauszufinden wie lange der User nichts macht, mußt Du dann
halt die globale Mausposition und Tastatureingaben überprüfen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

...für tatsächliches UserIdle gibt es die API LastInputInfo...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten