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? :roll: 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? :shock: 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.