Seite 1 von 1

Im Hintergrund weiter arbeiten

Verfasst: 20.08.2005 10:56
von MASH
Ich habe ein Fenster, welches arbeitet solange es aktiv ist. Wenn ich irgendwo anders draufklicke bleibt es stehen auch die Hauptschleife (Repeat Forever). Da eine Zeit gezählt wird muss es aber auch weiter laufen wenn es inaktiv ist. Und genau da ist das Problem!
Mit welchem Befehl ist das lösbar?

Verfasst: 20.08.2005 11:21
von jear
Das Fenster bleibt "stehen" weil es keine Events mehr bekommt.
Wenn Dein Programm sich aber selbst per Timer Events generiert , dann kannst Du es damit die laufende Zeit darstellen und auch andere Dinge tun lassen.

Verfasst: 20.08.2005 11:55
von Christi
WindowEvent()

Verfasst: 20.08.2005 12:02
von Tafkadasom2k5
Wenn du ein anderes Fenster öffnest und das alte soll aber noch "reaktionsfähig" sein-dann benutze "WindowEvent" und dann ein minimales Delay (um den Rechner ned voll auszulasten)..Ich weis nicht wie du deine Timer Routine gemacht hast, aber wenn diese auf Delays aufbaut, solltest du dir eine andere lösung ausdenken, weil sonst haste ja noch ne zusätzliche Verzögerung wenn du das nächste delay noch einbaust...

d.H.:
Du öffnest das 2te Fenster, machst WindowEvent() da hinein, und kopierst die ganze Timer-Routine da hinein.....und zusätzlich noch die Befehlslisten für das neue fenster....

Hoffe das war nicht zu kompliziert erklärt-wei-es ist ned kompliziert.. ^^
(Ich geb mir aber mühe)....

Gr33tz
Marc

P.s.: Wenn du deine Timer-Routine in eine prozedur packst gehts einfacher...

Verfasst: 20.08.2005 15:40
von MASH
und auf was für ein WindowEvent() soll ich das Programm reagieren lassen?

Verfasst: 20.08.2005 16:09
von NicTheQuick
Also ich hätts so gemacht:

Code: Alles auswählen

Procedure BeepThread(a.l)
  Beep_(888, 100)
EndProcedure

If OpenWindow(0, 0, 0, 400, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget, "TimerTest")
  Delay.l = 1000
  Time.l = ElapsedMilliseconds() + Delay
  Repeat
    If ElapsedMilliseconds() > Time
      Time + Delay
      CreateThread(@BeepThread(), 0)
    EndIf
    Select WindowEvent()
      Case #PB_EventCloseWindow
        Break
      Case 0
        Delay(1)
    EndSelect
  ForEver
EndIf
Allerdings ist der Code nicht für genaue Dinge gedacht, wenn man zwischenzeitlich das Fenster dauern minimiert und wiederherstellt.

Verfasst: 20.08.2005 18:37
von MASH
Mit Theards geht es einfach nicht! Ich möchte den code unten ablaufen lassen wenn das fenster inaktiv ist aber es geht einfach nicht auch nicht über ein WindowEvent()???

Code: Alles auswählen

Procedure Close()
  For e = 0 To CountLaufwerke - 1
    If Laufwerk(e)\Status = 0
      If Date() >= Laufwerk(e)\CloseTime - 5 And Laufwerk(e)\CloseSoundTime = 0
        Laufwerk(e)\CloseSoundTime = 1        
        If CloseSound.s <> "Ausgeschaltet"
          If CloseSound.s < "3"
            PlaySound(Val(CloseSound.s))
          Else
            PlaySound(4)
          EndIf
        EndIf
      EndIf
      If Date() >= Laufwerk(e)\CloseTime
        UseCDAudio(e)
        EjectCDAudio(0)
        Laufwerk(e)\Status = 1
      EndIf
    EndIf
  Next e
EndProcedure

Verfasst: 20.08.2005 22:52
von vonTurnundTaxis
Wird die Prozedur aufgerufen?

Ansonsten meinte Christi vermutlich, dass du anstatt von WaitWindowEvent() WindowEvent() verwenden sollst.

Verfasst: 20.08.2005 23:07
von Christi
vonTurnundTaxis hat geschrieben:Ansonsten meinte Christi vermutlich, dass du anstatt von WaitWindowEvent() WindowEvent() verwenden sollst.
Ja, das ist ein uriges Thema, mal sehn wieviele Threads es noch zu dieser "Problematik" geben wird.

Verfasst: 23.08.2005 21:43
von MASH
Die Prozedur soll bei jedem Durchlauf der Haupt-Schleife "Repeat:Forever" aufgerufenw erden.