Seite 1 von 3
Event = WaitWindowEvent(1) im Thread.
Verfasst: 20.04.2016 09:06
von funkheld
Hallo, guten Tag.
Zu welchen Lasten geht dieses :
Event = WaitWindowEvent(1)
in einem Thread ?
Ich frage Daten ab von einer seriellen Schnittstelle im Thread.
Damit werden die Daten nicht ausgegeben im Hauptprogramm:
Event = WaitWindowEvent()
nur hiermit:
Event = WaitWindowEvent(1)
Wird mein Hauptprogramm gebremst oder nur der Thread ?
danke.
Gruss
Code: Alles auswählen
Global text_c.s
Global port.l,r_byte.c
Procedure SeriellStuff(*Interval)
port=OpenSerialPort(#PB_Any, "COM1", 19200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024,1024)
Repeat
Event = WaitWindowEvent(1)
If port > 0
While AvailableSerialPortInput(port)
ReadSerialPortData(port, @r_byte, 1)
If r_byte <> #LF
text_c + Chr(r_byte)
Else
PrintN(text_c)
text_c=""
EndIf
Wend
EndIf
ForEver
EndProcedure
If OpenConsole()
thread = CreateThread(@SeriellStuff(), 17)
Input()
CloseConsole()
EndIf
End
Re: Event = WaitWindowEvent(1) im Thread.
Verfasst: 20.04.2016 09:17
von RSBasic
Wenn WaitWindowEvent() ohne Parameter verwendet wird, dann wird auf ein Event gewartet. Wenn kein Event entsteht, dann bleibt die Schleife quasi stehen. D.h. wenn in deinem Thread was passiert und es gibt kein Event, das ausgelöst wird, dann kann in der Schleife nichts ausgewertet werden, weil WaitWindowEvent() noch auf ein Event wartet. Ein Event entsteht z.B. auch, wenn du innerhalb deines Fensters deine Maus bewegst. Wenn du die Maus nicht bewegst, dann gibt es auch kein Event.
Der optionale Timeout-Parameter sorgt dafür, dass nach x Millisekunden spätestens trotzdem fortgesetzt wird und nicht mehr auf ein Event gewartet wird. Selbst wenn kein Event ausgelöst wird, dann wird die Schleife nach x Millisekunden trotzdem komplett abgearbeitet.
Das steht aber auch in der PB-Hilfe. Siehe:
http://www.purearea.net/pb/german/manua ... event.html
Du kannst aber auch aus dem Thread heraus ein Event manuell auslösen. Siehe: PostEvent()
Re: Event = WaitWindowEvent(1) im Thread.
Verfasst: 20.04.2016 09:54
von funkheld
Danke für die Info.
WaitWindowEvent(100) eine Bremse im Thread oder im Hauptprogramm?
Danke.
Gruss
Re: Event = WaitWindowEvent(1) im Thread.
Verfasst: 20.04.2016 09:59
von RSBasic
WaitWindowEvent() darf nur im Main-Code vorhanden sein und nur einmal.
Wenn du in deinem Thread eine Pause einfügen möchtest, verwende Delay().
Dein Thread läuft unabhängig. Wenn in deinem Thread ein Delay vorhanden ist, dann wrd dein Fenster nicht gebremst, sondern nur dein Thread.
Re: Event = WaitWindowEvent(1) im Thread.
Verfasst: 20.04.2016 10:21
von funkheld
Danke.
Enumeration #PB_Event_FirstCustomValue
Ist der Name feste vergeben:
#PB_Event_FirstCustomValue
Danke.
Gruss
Re: Event = WaitWindowEvent(1) im Thread.
Verfasst: 20.04.2016 10:41
von RSBasic
#PB_Event_FirstCustomValue kannst du verwenden, wenn du eigene Events erstellen möchtest. Vorteil ist, dass es keine Kollision mit anderen bereits vorhandenen Event-Konstanten gibt.
Wenn du mehrere benutzerdefinierte Event-Konstanten erstellen möchtest, kannst du z.B. so machen:
Code: Alles auswählen
Enumeration #PB_Event_FirstCustomValue
#DeinEvent1
#DeinEvent2
#DeinEvent3
EndEnumeration
Oder:
Code: Alles auswählen
#DeinEvent1 = #PB_Event_FirstCustomValue
#DeinEvent2 = #PB_Event_FirstCustomValue + 1
#DeinEvent3 = #PB_Event_FirstCustomValue + 2
Den Namen der Konstanten "#DeinEvent1", "#DeinEvent2" und "#DeinEvent3" kannst du natürlich selber bestimmen. Wichtig ist nur, dass der Wert ab #PB_Event_FirstCustomValue beginnt. Sonst kann es passieren, dass du versehentlich denselben Wert einer bereits vorhandenen Konstante benutzt und es wird ggf. ein unerwünschtes Event ausgelöst.
Falls du kein eigenes Event erstellen und auslösen möchtest, kannst du natürlich die gewünschte PB-Konstante verwenden. Beispielsweise #PB_Event_Gadget und im Objekt-Parameter deine Gadgetnummer, wenn du z.B. ein Buttonklick simulieren möchtest.
Re: Event = WaitWindowEvent(1) im Thread.
Verfasst: 20.04.2016 12:31
von funkheld
Ja danke.
Kann man es dann so in etwa schreiben?
Code: Alles auswählen
.....
Enumeration #PB_Event_FirstCustomValue
#EventProcess_1
EndEnumeration
....
....
Case #EventProcess_1
SetGadgetText(#Editor_0, text_e)
......
......
Procedure Seriellread(*Interval)
Repeat
If port > 0
While AvailableSerialPortInput(port)
ReadSerialPortData(port, @r_byte, 1)
If r_byte <> #LF
text_e + Chr(r_byte)
Else
PostEvent(#EventProcess_1)
EndIf
Wend
EndIf
ForEver
EndProcedure
Gruss
Re: Event = WaitWindowEvent(1) im Thread.
Verfasst: 20.04.2016 13:05
von RSBasic
Ja, kann man.
Lauffähiges Beispiel:
Code: Alles auswählen
EnableExplicit
Enumeration #PB_Event_FirstCustomValue
#EventProcess_1
EndEnumeration
Procedure Thread(z)
Delay(3000)
PostEvent(#EventProcess_1)
EndProcedure
If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateThread(@Thread(), 0)
Repeat
Select WaitWindowEvent()
Case #EventProcess_1
Debug "Hallo Welt"
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
EndIf
Re: Event = WaitWindowEvent(1) im Thread.
Verfasst: 20.04.2016 13:08
von xXRobo_CubeXx
Was ist wen man WaitWindowEvent ein zweites Mal abfragen möchte?

Ich möchte in der Loop später unten auf ein bestimmtes Event prüfen. Wie soll man das machen wenn man nur einmal nutzen darf?

Was kann den passieren wenn man es mehr als einmal nutzt?

Re: Event = WaitWindowEvent(1) im Thread.
Verfasst: 20.04.2016 13:12
von NicTheQuick
Dann speicherst du den Rückgabewert in einer Variablen und nutzt diese mehrmals.
Wenn du hingegen 'WaitWindowEvent()' selbst mehrmals nutzt, bekommst du bei jedem weiteren Aufruf trotzdem ein anderes Event. Das willst du aber bestimmt nicht. Deswegen gibt es die Empfehlung es nur einmal zu verwenden.