RSBasic hat geschrieben:Außerdem, wenn du einen Timer benutzen möchtest,brauchst du kein SetTimer_() mehr. PB bietet schon lange eine eigene Funktion an: AddWindowTimer()
Jetzt weis ich auch warum ich keine neuen Beiträge mehr zu settimer_ finde, sry, 6 Jahre lügen nicht.
Also, Zwischenstand, zwei Threads hab ich erfolgreich gegen settimer_ ersetzt (werd ich ncoh abändern auf AddWindowTimer()
Der Letzte Thread funktioniert, aber ich denke da ist noch "Crash-Potential" da, das möchte ich noch beheben:
Dieser Code wird vom Timer alle 100ms aufgerufen und erstellt immer wenn sich der Fenstertitel ändert, einen Thread (weiter unten), der aber bevor dieser ein zweites Mal gestartet wird vorher getötet wird.
Code: Alles auswählen
Procedure GetNewWindowTitle()
Static title.s{1024}
Static Thread_LEDEffects
Static count.l
If IsWindow_(Window_hWnd)
GetWindowText_(Window_hWnd, @title, 1024)
If Not Window_Title$ = title
Window_Title$ = title
If IsThread(Thread_LEDEffects)
KillThread(Thread_LEDEffects)
EndIf
Thread_LEDEffects = CreateThread(@LEDEffects(), 0)
;Debug "[Title] = " + title
EndIf
Else
;Debug "Programm scheinbar geschlossen"
If count < 1
EnumWindows_(@GetWindowHandle(),#True)
count = 10
Else
count = count - 1
EndIf
EndIf
EndProcedure
Thread:
Code: Alles auswählen
Procedure LEDEffects(Parameter)
Protected path$ = "", trigger$ = "", n, m, o
path$ = Mid(Window_Title$, 29)
trigger$ = StringField(path$, CountString(path$, "\"), "\") + "\" + GetFilePart(path$)
MyDebug("~ " + Chr(34) + "Screen: " + trigger$ + Chr(34))
For n = 0 To (#LED_CODES_MAX - 1)
If CSV_Array(n)\Screen = trigger$
Repeat
For o = 1 To CSV_Array(n)\Sequences
For m = 1 To #LED_MAX
LED_Array(m - 1, #AM) = Red(CSV_Array(n + o - 1)\LED[m - 1])
LED_Array(m - 1, #KW) = Green(CSV_Array(n + o - 1)\LED[m - 1])
LED_Array(m - 1, #WW) = Blue(CSV_Array(n + o - 1)\LED[m - 1])
Next m
SendTMP2Data()
Delay(CSV_Array(n)\Time)
Next o
Until CSV_Array(n)\Loop <> 1
Break
EndIf
Next n
Wo ich gerade noch Verbesserungspotential sehe:
- LED_Array ist Global und übergibt quasi die Daten vom LEDEffects() zu SendTMP2Data()
=> nix global, direkt an die Procedure übergeben. (Wird SendTMP2Data() auch getötet wenn der LEDEffects()-Thread gekillt wird?
- die Window_Title$ wäre denke ich noch gut auch dem Thread anders zu übergeben, da könnte was passiern ...
- Gut die CSV_Array wird am Anfang des Programms gefüttert und dann nur noch vom Thread angefasst, das sollte passen.
Was denkt ihr (soweit man das an den beiden Code-Ausschnitten sehn kann