Event = WaitWindowEvent(1) im Thread.

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Event = WaitWindowEvent(1) im Thread.

Beitrag 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
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Event = WaitWindowEvent(1) im Thread.

Beitrag 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()
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Event = WaitWindowEvent(1) im Thread.

Beitrag von funkheld »

Danke für die Info.

WaitWindowEvent(100) eine Bremse im Thread oder im Hauptprogramm?


Danke.
Gruss
Zuletzt geändert von funkheld am 20.04.2016 10:21, insgesamt 2-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Event = WaitWindowEvent(1) im Thread.

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Event = WaitWindowEvent(1) im Thread.

Beitrag von funkheld »

Danke.

Enumeration #PB_Event_FirstCustomValue
Ist der Name feste vergeben:
#PB_Event_FirstCustomValue

Danke.
Gruss
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Event = WaitWindowEvent(1) im Thread.

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Event = WaitWindowEvent(1) im Thread.

Beitrag 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
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Event = WaitWindowEvent(1) im Thread.

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
xXRobo_CubeXx
Beiträge: 120
Registriert: 12.06.2015 16:08
Computerausstattung: Version 5.41 LTS
Wohnort: Wohnort
Kontaktdaten:

Re: Event = WaitWindowEvent(1) im Thread.

Beitrag 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? :?:
Version 5.41 LTS :)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Event = WaitWindowEvent(1) im Thread.

Beitrag 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.
Antworten