Hm hab mir das mal angesehen und versucht um zu setzen. Scheint mir aber nicht gelungen zu sein, läuft nun sogar schlechter als vorher Oo was mache ich falsch?
Code: Alles auswählen
Global SerialPortName$, Baud, Parity, DataLength, Stop.f, HandshakeMode, InputBufferSize, OutputBufferSize, Terminator$
Global Window_0
Global Button_0, Time, OldStatusDate$
Global ThreadRunning, CloseSoftware = #False
Global Window = 0
SerialPortName$ = "Com1"
Baud = 9600
Parity = #PB_SerialPort_NoParity
DataLength = 8
Stop = 2
HandshakeMode = #PB_SerialPort_NoHandshake
InputBufferSize = 1024
outputBufferSize = 1024
Terminator$ = ""
#SerialPort = 0
Procedure ThreadRunning(Write.b, Value.b)
Shared Mutex
LockMutex(Mutex)
If Write
ThreadRunning = Value
EndIf
UnlockMutex(Mutex)
ProcedureReturn ThreadRunning
EndProcedure
Procedure ThreadWindow(Write.b, Value)
Shared Mutex
LockMutex(Mutex)
If Write
Window = Value
EndIf
UnlockMutex(Mutex)
ProcedureReturn Window
EndProcedure
Procedure WaitForThread()
While ThreadRunning(#False, #False)
Delay(5)
Wend
EndProcedure
Procedure.l OpenRsPort()
ProcedureReturn OpenSerialPort(#SerialPort, SerialPortName$, Baud, Parity, DataLength, Stop.f, HandshakeMode, InputBufferSize, OutputBufferSize)
EndProcedure
Procedure IsRsPort()
If IsSerialPort(#SerialPort)
ProcedureReturn 1
Else
ProcedureReturn OpenRsPort()
EndIf
EndProcedure
Procedure.l WriteRsString(String$)
If IsRsPort()
ReturnValue = WriteSerialPortString(#SerialPort, String$ + Terminator$)
Else
ReturnValue = 0
EndIf
ProcedureReturn ReturnValue
EndProcedure
Procedure.s ReadRsString()
If IsRsPort()
While Wait < 149
Buffer = AvailableSerialPortInput(#SerialPort)
If Buffer > 0
While Buffer > 0
ReadSerialPortData(#SerialPort,@RD,1)
Receive$ + Chr(RD)
Buffer = AvailableSerialPortInput(#SerialPort)
If Buffer < 2
Delay(5)
Buffer = AvailableSerialPortInput(#SerialPort)
EndIf
Wend
Else
Wait+1
Delay(1)
EndIf
Wend
EndIf
ProcedureReturn Receive$
EndProcedure
Procedure OpenWindow_0()
Window_0 = OpenWindow(#PB_Any, 0, 0, 340, 280, "Thread_Test", #PB_Window_SystemMenu)
CreateStatusBar(0, WindowID(Window_0))
AddStatusBarField(50)
StatusBarText(0, 0, "Label")
AddStatusBarField(50)
StatusBarText(0, 1, "Label")
AddStatusBarField(50)
StatusBarText(0, 2, "Label")
AddStatusBarField(50)
StatusBarText(0, 3, "Label")
Button_0 = ButtonGadget(#PB_Any, 130, 100, 70, 30, "test")
EndProcedure
Procedure Window_0_Events(event)
Select event
Case #PB_Event_CloseWindow
ProcedureReturn #False
Case #PB_Event_Menu
Select EventMenu()
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case Button_0
ThreadWindow(#True, 2)
WaitForThread()
Debug("test")
ThreadWindow(#True, 0)
EndSelect
EndSelect
ProcedureReturn #True
EndProcedure
Procedure SetStatusState(Boolean.b)
If Connected
If Boolean = #False
StatusBarImage(0, 0, ImageID(Img_0))
StatusBarText(0, 1, "Nicht verbunden")
Connected = #False
EndIf
Else
If Boolean
StatusBarImage(0, 0, ImageID(Img_101))
StatusBarText(0, 1, "Verbunden")
Connected = #True
EndIf
EndIf
EndProcedure
Procedure SetStatusDate(ThreadWert)
Repeat
If ThreadWindow(#False, 0) = 0
ThreadRunning(#True, #True)
WriteRsString("UL")
Receive$ = ReadRsString()
If Receive$ <> ""
Receive$ = RemoveString(Receive$, ":")
StatusTime$ = Left(Receive$, 6)
StatusTime$ = InsertString(StatusTime$, ":", 5)
StatusTime$ = InsertString(StatusTime$, ":", 3)
If OldStatusTime$ <> StatusTime$
StatusBarText(0, 3, StatusTime$ + " Uhr")
OldStatusTime$ = StatusTime$
EndIf
StatusDate$ = Right(Receive$, 8)
Select DayOfWeek(Date(Val(Right(StatusDate$, 4)), Val(Mid(StatusDate$, 3, 2)), Val(Left(StatusDate$, 2)), 0, 0, 0))
Case 0
Day$ = "Sonntag"
Case 1
Day$ = "Montag"
Case 2
Day$ = "Dienstag"
Case 3
Day$ = "Mittwoch"
Case 4
Day$ = "Donnerstag"
Case 5
Day$ = "Freitag"
Case 6
Day$ = "Samstag"
EndSelect
Select Val(Mid(StatusDate$, 3, 2))
Case 1
Month$ = "Januar"
Case 2
Month$ = "Februar"
Case 3
Month$ = "März"
Case 4
Month$ = "April"
Case 5
Month$ = "Mai"
Case 6
Month$ = "Juni"
Case 7
Month$ = "Juli"
Case 8
Month$ = "August"
Case 9
Month$ = "September"
Case 10
Month$ = "Oktober"
Case 11
Month$ = "November"
Case 12
Month$ = "Dezember"
EndSelect
StatusDate$ = Day$ + " den " + Left(StatusDate$, 2) + " " + Month$ + " " + Right(StatusDate$, 4)
If StatusDate$ <> OldStatusDate$
StatusBarText(0, 2, StatusDate$)
OldStatusDate$ = StatusDate$
EndIf
SetStatusState(#True)
Else
CloseSerialPort(#SerialPort)
Select DayOfWeek(Date())
Case 0
Day$ = "Sonntag"
Case 1
Day$ = "Montag"
Case 2
Day$ = "Dienstag"
Case 3
Day$ = "Mittwoch"
Case 4
Day$ = "Donnerstag"
Case 5
Day$ = "Freitag"
Case 6
Day$ = "Samstag"
EndSelect
Select Month(Date())
Case 1
Month$ = "Januar"
Case 2
Month$ = "Februar"
Case 3
Month$ = "März"
Case 4
Month$ = "April"
Case 5
Month$ = "Mai"
Case 6
Month$ = "Juni"
Case 7
Month$ = "Juli"
Case 8
Month$ = "August"
Case 9
Month$ = "September"
Case 10
Month$ = "Oktober"
Case 11
Month$ = "November"
Case 12
Month$ = "Dezember"
EndSelect
StatusDate$ = Day$ + " den " + FormatDate("%dd. ", Date()) + Month$ + FormatDate(" %yyyy", Date())
If StatusDate$ <> OldStatusDate$
StatusBarText(0, 2, StatusDate$)
OldStatusDate$ = StatusDate$
EndIf
StatusTime$ = FormatDate("%hh:%ii:%ss", Date())
If OldStatusTime$ <> StatusTime$
StatusBarText(0, 3, StatusTime$ + " Uhr")
OldStatusTime$ = StatusTime$
EndIf
SetStatusState(#False)
EndIf
Delay(1000)
Else
ThreadRunning(#True, #False)
EndIf
Until CloseSoftware = #True
ThreadRunning(#True, #False)
EndProcedure
OpenWindow_0()
Mutex = CreateMutex()
CreateThread(@SetStatusDate(), 0)
Repeat
Select ThreadWindow(#False, 0)
Case 0
If Window_0_Events(WaitWindowEvent(25)) = #False
CloseSoftware = #True
EndIf
; Case 1
; If Window_1_Events(WaitWindowEvent(25)) = #False
; Close(Window)
; EndIf
; Case 2
; If Window_2_Events(WaitWindowEvent(25)) = #False
; Close(Window)
; EndIf
; Case 3
; If Window_3_Events(WaitWindowEvent(25)) = #False
; Close(Window)
; EndIf
; Case 4
; If Window_4_Events(WaitWindowEvent(25)) = #False
; Close(Window)
; EndIf
; Case 5
; Event = WaitWindowEvent(25)
; If Event = #PB_Event_SizeWindow
; Window_5_Events(Event)
; ZeichneKurve()
; Else
; If Window_5_Events(Event) = #False
; Close(Window)
; EndIf
; EndIf
; Case 6
; If Window_6_Events(WaitWindowEvent(25)) = #False
; Close(Window)
; EndIf
; Case 7
; If Window_7_Events(WaitWindowEvent(25)) = #False
; Close(Window)
; EndIf
; Case 8
; If Window_8_Events(WaitWindowEvent(25)) = #False
; Close(Window)
; EndIf
EndSelect
Until CloseSoftware = #True
WaitForThread()