Was anderes für DELAY()

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Then
Beiträge: 285
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Was anderes für DELAY()

Beitrag 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 ??
PB 6.10LTs / Windows 11 64Bit (i9/32GB/ 1TB-SSD+4TB-HDD/3060GTX12GB) / 2x27" Multitouch

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Was anderes für DELAY()

Beitrag von RSBasic »

Mit Timer vielleicht?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Then
Beiträge: 285
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: Was anderes für DELAY()

Beitrag 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.
PB 6.10LTs / Windows 11 64Bit (i9/32GB/ 1TB-SSD+4TB-HDD/3060GTX12GB) / 2x27" Multitouch

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Was anderes für DELAY()

Beitrag von RSBasic »

Du kannst das in einem Thread erledigen und Delay()s verwenden. Dann läuft es unabhängig.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Then
Beiträge: 285
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: Was anderes für DELAY()

Beitrag von Then »

hmmm... und diesen Thread kann ich killen ?! Habe mich damit leider noch nicht beschäftigt, aber klingt ganz gut !!! :)
PB 6.10LTs / Windows 11 64Bit (i9/32GB/ 1TB-SSD+4TB-HDD/3060GTX12GB) / 2x27" Multitouch

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Was anderes für DELAY()

Beitrag von RSBasic »

Ja (KillThread()) oder du machst es mit einer globalen Variablen, um mitzuteilen, dass dein Thread vorzeitig beendet werden soll.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Was anderes für DELAY()

Beitrag 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)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Then
Beiträge: 285
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: Was anderes für DELAY()

Beitrag 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...
PB 6.10LTs / Windows 11 64Bit (i9/32GB/ 1TB-SSD+4TB-HDD/3060GTX12GB) / 2x27" Multitouch

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Antworten