mich quält nun schon seit einiger Zeit ein mieser Fehler. Da er in einem recht großen Projekt auftritt, und zudem auch noch sehr sporadisch und zufällig, konnte ich die Ursache lange Zeit nicht finden. Nun kann es sein, dass ich ihm nun etwas auf die Schliche gekommen bin. Allerdings ist immer noch sehr viel Zufall im Spiel, alles sehr strange. Hier man ein kleiner Testcode, der den Fehler erzeugt:
Code: Alles auswählen
Global NewList event.i()
Global mutex = CreateMutex()
Procedure TestThread(hallo)
Repeat
LockMutex(mutex)
If NextElement(event())
DeleteElement(event())
AddGadgetItem(0, 0, "Event "+Str(ElapsedMilliseconds()))
EndIf
UnlockMutex(mutex)
Delay(10)
ForEver
EndProcedure
Procedure Main()
OpenWindow(0, 0, 0, 200, 400, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ListViewGadget(0, 0, 0, 200, 400)
CreateThread(@TestThread(), 0)
Repeat
event = WaitWindowEvent(10)
If (event = #PB_Event_CloseWindow)
quit = #True
EndIf
If (Random(5) = 0) ; <-- hier Wert verkleinern, falls kein Fehler auftritt
LockMutex(mutex)
AddElement(event())
ResetList(event())
UnlockMutex(mutex)
EndIf
Until (quit)
EndProcedure
Main()
Bei Tests im Originalprogramm habe ich noch merkwürdigere Dinge erlebt, in dem der Programmfluss komplett unkontrolliert wurde. So kam es dann dazu, dass "Test1" ausgegeben wurde, "Test2" aber nicht, obwohl dazwischen nur eine einfache Zuweisung stand:
Code: Alles auswählen
Debug "Test1"
c = d
Debug "Test2"
PB: 5.11 / 5.20 Beta, 32 Bit, Threadsafe aktiviert
lg Kevin