Seite 1 von 1

Was anderes für DELAY()

Verfasst: 28.04.2014 15:07
von Then
Hallo, auch ich suche was anderes für Delay() oder evtl etwas, wie man es umgeht....

Grund : Ich habe eine Lichtsteuerung und mit dieser programmiere ich verschiedene Effekte. Dabei ist zB auch ein Lauflicht. Die LEDs sind im Kreis eingebaut und es sind 16 Stück. nun leuchten diese hintereinander immer im Kreis. Ich habe ein Fenster geöffnet und möchte diesen Effekt mit einem Klick SOFORT unterbrechen, nicht erst wenn er durchgelaufen ist. Leider bekomme ich das nicht hin.

Mein Code ist in etwa so : (bei 5.22 kommt was mit POLINK : FATAL ERROR)

Code: Alles auswählen

OpenWindow(0,0,0,120,130,"LED",#PB_Window_ScreenCentered)

  OptionGadget(1, 20, 10, 20, 20, "")
  OptionGadget(2, 40, 10, 20, 20, "")
  OptionGadget(3, 60, 10, 20, 20, "")
  OptionGadget(4, 80, 10, 20, 20, "")
  OptionGadget(5,100, 10, 20, 20, "")
  ButtonGadget(6,10,40,100,20,"Effekt 1")
  ButtonGadget(7,10,70,100,20,"Effekt 2")
  ButtonGadget(8,10,100,100,20,"Ende")
  
  Effekt=1
  alt=5

  Repeat
  
   Delay(1)
   
   If Effekt=1
    For x=1 To 5
     SetGadgetState(x,1)
    ;LED(x,1) ; damit schalte ich die LED an
    ;LED(alt,0) ; damit schalte ich die alte LED aus
     alt=x
     Delay(300)
     While WindowEvent()<>0:Wend
    Next
   EndIf 
   
   Event = WindowEvent()
    Select Event
     Case #PB_Event_Gadget
      Select EventGadget()
       Case 6
        Effekt=1
       Case 7
        Effekt=2
       Case 8
        End
      EndSelect
    EndSelect
  ForEver
Jedenfalls darf ich die Signale nicht zu schnell an den Controller schicken, weil er sonst die hälfte verschluckt und es nicht mehr schön aussieht. Manche Effekte müssen sogar etwas längere Pausen haben, dennoch will ich diese stoppen können. Wie geht's am besten ??

Re: Was anderes für DELAY()

Verfasst: 28.04.2014 15:09
von RSBasic
Mit Timer vielleicht?

Re: Was anderes für DELAY()

Verfasst: 28.04.2014 16:09
von Then
habe ich mir schonmal gedacht, aber manche "Effekte" sind so aufwendig, dass ich nicht immer mit dem TIMER rumfummeln will, gibt's denn da nix anderes ?? ich benötige in einem sogar 16 versch. lange DELAYs, ist dann lästig wenn ich erst warten muß, bis der Effekt zu ende ist und ich dann genau abfangen muss, wann ich stoppe. Es sollte mittendrin abgebrochen werden können, aber dennoch nicht zu schnell laufen.

Re: Was anderes für DELAY()

Verfasst: 28.04.2014 16:11
von RSBasic
Du kannst das in einem Thread erledigen und Delay()s verwenden. Dann läuft es unabhängig.

Re: Was anderes für DELAY()

Verfasst: 28.04.2014 16:52
von Then
hmmm... und diesen Thread kann ich killen ?! Habe mich damit leider noch nicht beschäftigt, aber klingt ganz gut !!! :)

Re: Was anderes für DELAY()

Verfasst: 28.04.2014 16:55
von RSBasic
Ja (KillThread()) oder du machst es mit einer globalen Variablen, um mitzuteilen, dass dein Thread vorzeitig beendet werden soll.

Re: Was anderes für DELAY()

Verfasst: 28.04.2014 17:23
von ts-soft
KillThread Hilfe hat geschrieben:Dies ist eine sehr gefährliche Operation und sollte nur selten benutzt werden. Das Problem ist, dass der Thread umgehend entfernt wird und keine Chance hat, irgendwelchen "Aufräumcode" (z.B. Speicher freigeben, Einträge freigeben, De-Allokieren seines eigenen Stacks) auszuführen.
Statt einer globalen Variable, läßt sich für diesen Zweck auch hervorragend eine Semaphore einsetzen:

Code: Alles auswählen

EnableExplicit

Global Semaphore = CreateSemaphore()

Procedure MyThread(dummy)
  Protected a
  While TrySemaphore(Semaphore) = 0
    a + 1
    Debug a
    Delay(200)
  Wend
EndProcedure


OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "")
ButtonGadget(0, 10, 10, 100, 25, "Stop Thread")

Define Thread = CreateThread(@MyThread(), 0)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      SignalSemaphore(Semaphore)
      Break
    
    Case #PB_Event_Gadget
      If EventGadget() = 0
        SignalSemaphore(Semaphore)
      EndIf
  EndSelect
ForEver

WaitThread(Thread, 5000)

Re: Was anderes für DELAY()

Verfasst: 29.04.2014 08:45
von Then
Also dieser Code ist astrein, vielen Dank !!! :allright:

aber wenn ich den in PB 5.22 direkt starte geht er, wenn ich jaPBe.exe starte kommt immer "Polink : FATAL ERROR" und nix geht... habe mir auch den neusten jaPBe runtergeladen. Stell ich den auf deutsch, reagiert er gar nicht mehr und auf english ists eben der Fehler oben... :| immer was neues...