Der PureBasic-Compiler kann nur einen String gleichzeitig bearbeiten. Ich
versuche es in Stichworten zu erklären:
- Thread 1 bearbeitet einen String
- Windows wechselt zu Thread 2
- Thread 2 fängt an einen String zu bearbeiten
- die globalen Werte zur Stringbearbeitung in PB werden verändert
- Windows wechselt zu Thread 1
- Die Stringbearbeitung wird falsch abgeschlossen, weil Thread 2 gleichzeitig auf die Stringproceduren zugegriffen hat
- "PureBasic.exe hat einen Fehler verursacht..."
Hier mal ein Code, der nur mit Threadsafe funktioniert:
Code: Alles auswählen
Global s.s = "hallo", Quit.l = #False
Procedure Thread(dummy.l)
Repeat
If s = "hallo"
s + " du da!"
ElseIf Right(s, 7) = " du da!"
s = Left(s, 5)
EndIf
Until Quit
EndProcedure
thread1 = CreateThread(@Thread(), 0)
thread2 = CreateThread(@Thread(), 0)
OpenConsole()
Repeat
PrintN(s)
Delay(100)
Until GetAsyncKeyState_(#VK_ESCAPE)
Quit = #True
WaitThread(thread1)
WaitThread(thread2)
CloseConsole()
Eigentlich sollte meinem Wissen zufolge der Fehler auch auftreten, wenn
zwei unterschiedliche Strings manipuliert werden, aber da ist nichts
passiert.
Um es selbst zu testen, einfach hinter "Procedure" noch ein "Protected s.s = "hallo""
einfügen.