als Purebasic-Anfänger komme ich jetzt einfach nicht mehr weiter und bitte um Mithilfe bei meinen Verständnisproblemen - ich hoffe, ich treffe den "Forumston"...

Anbei der "problematische Code":
**common.pb**
Code: Alles auswählen
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)
;- Window Constants
;
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
;
Enumeration
#btnOSP
#btnM0001
#btnM0000
#btnGET
#Frame3D_0
#txtAnzeige
#btnExit
EndEnumeration
Procedure Open_Window_0()
If OpenWindow(#Window_0, 375, 191, 800, 600, "RS232", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_WindowCentered )
;If CreateGadgetList(WindowID(#Window_0))
ButtonGadget(#btnOSP, 40, 530, 120, 40, "Open Serial Port")
ButtonGadget(#btnM0001, 340, 530, 120, 40, "Mode0001")
ButtonGadget(#btnM0000, 190, 530, 120, 40, "Mode0000")
ButtonGadget(#btnGET, 490, 530, 120, 40, "Get Data")
Frame3DGadget(#Frame3D_0, 30, 30, 740, 480, "", #PB_Frame3D_Double)
TextGadget(#txtAnzeige, 40, 40, 720, 460, "")
ButtonGadget(#btnExit, 640, 530, 120, 40, "Exit")
;EndIf
EndIf
EndProcedure
Code: Alles auswählen
EnableExplicit
IncludeFile "Common.pb"
Global Anzeige$
Procedure Send_Delay (Befehl$)
Define i.i
For i= 1 To Len(Befehl$)
If WriteSerialPortString(1, Mid(Befehl$, i, 1))
;PrintN("Ok")
Else
Print("Fehler:")
PrintN(Str(SerialPortError(1)))
EndIf
Delay(5)
Next i
EndProcedure
Procedure Mode0000()
Send_Delay("mode0000"+Chr(13))
Delay(200)
Send_Delay("mode0000"+Chr(13))
Anzeige$=Anzeige$+"MODE0000"+Chr(13)
EndProcedure
Procedure Mode0001()
Send_Delay("mode0001"+Chr(13))
Anzeige$=Anzeige$+"MODE0001"+Chr(13)
EndProcedure
Procedure.s ReadSerialPortString()
Define bInput.b, Puffer$
While AvailableSerialPortInput ( 1 ) > 0 ; Solange Empfangen wie Daten vorhanden sind.
ReadSerialPortData ( 1 , @bInput , SizeOf ( BYTE ) ) ; Byte abholen.
Puffer$=Puffer$+Chr(bInput)
Wend
ProcedureReturn Puffer$
EndProcedure
Procedure Werte_abfragen(Anzahl.w)
Define Test$, i.w
Delay(1000)
Test$=ReadSerialPortString() ;die erste Sekunde wird nicht berücksichtigt
For i=1 To Anzahl
Delay(1000)
Test$=ReadSerialPortString()
Anzeige$=Anzeige$+Test$
SetGadgetText(#txtAnzeige,Anzeige$)
Next i
EndProcedure
Define Ereignis.w
Define WindowID.w
Define GadgetID.w
Define Ereignistyp.w
Anzeige$=""
Open_Window_0()
Repeat ; Start of the event loop
Ereignis = WaitWindowEvent() ; This line waits until an event is received from Windows
WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
GadgetID = EventGadget() ; Is it a gadget event?
Ereignistyp = EventType() ; The event type
If Ereignis = #PB_Event_Gadget
If GadgetID = #btnOSP
OpenSerialPort(1, "COM6", 19200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
ElseIf GadgetID = #btnM0001
Mode0001()
ElseIf GadgetID = #btnM0000
Mode0000()
ElseIf GadgetID = #btnGET
Werte_abfragen(10)
ElseIf GadgetID = #btnExit
End
EndIf
SetGadgetText(#txtAnzeige, Anzeige$)
EndIf
Until Ereignis = #PB_Event_CloseWindow ; End of the event loop
CloseSerialPort(1)
End
Aber: Wenn ich die Messdaten hole, dauert das wegen der Delay()-Funktionen natürlich absichtlich etliche Sekunden (ist Absicht, das Gerät sendet automatisch alle 1000 ms Informationen); während dieser Zeit ist der Button "Get Data" im "Angeklickt"-Zustand. Nun meine Fragen:
1.) Warum schaltet der Button während dieser Zeit nicht wieder um, er wurde ja bereits gedrückt?
2.) Warum nimmt der Button / das Programm, obwohl er wie gedrückt erscheint, scheinbar noch Clicks an (wenn ich mehrmals darauf drücke, werden mehrmals die 10 Datensätze abgefragt?
3.) Muss ich den Button in dem Moment zurückprogrammieren?
4.) Kann man die Mehrfach-Clicks unterbinden, z. B. indem man "ausgraut", also inaktiviert?
5.) Komme ich hier evtl. voll in die Thread-Problematik rein?
Für Hilfe wäre ich sehr dankbar,
Euer
Tom123