Thorium hat geschrieben:Du kannst den String auch selbst schützen. Du kannst dafür einen Mutex verwenden.
Ich habe in meinem obigen Code mal für Testzwecke
Code: Alles auswählen
For i=1 To 9999
DataAccessing = 1
If IsThread(ThreadID) : KillThread(ThreadID) : EndIf
ThreadID = CreateThread(@DataAccessProc(),@DataAccessing)
Next
durch
Code: Alles auswählen
For i=1 To 9999
DataAccessing = 1
If IsThread(ThreadID) = 0
ThreadID = CreateThread(@DataAccessProc(),@DataAccessing)
EndIf
Next
ersetzt und es funktioniert. Das klappt aber nur in diesem Democode und nicht in meinem eigentlichen Programm. Und ich weiß auch warum. Folgt nach der Erstellung des Threads noch weiterer Programmcode schmiert es ab, auch mit Mutexes.
Code: Alles auswählen
EnableExplicit
Global Mutex = CreateMutex()
Declare DataAccessProc(lParam)
Define Highscore
Define i, DataAccessing, ThreadID, TempDir$
Procedure.s MyFunction(Wert1,Wert2)
; anderer Kram
EndProcedure
For i=1 To 9999
DataAccessing = 1
If IsThread(ThreadID) = 0
ThreadID = CreateThread(@DataAccessProc(),@DataAccessing)
TempDir$ = GetTemporaryDirectory()
EndIf
Next
Procedure DataAccessProc(lParam)
LockMutex(Mutex)
Protected HighScore$ = MyFunction(1,20)
PokeL(lParam,0)
UnlockMutex(Mutex)
EndProcedure
Thorium hat geschrieben:Das selbst schützen scheint aber gerade bei Strings nicht immer wasserdicht zu sein.
Ich denke da scheint der Hund begraben zu sein. Ich erinnere mich noch an meinen Mediaplayer der im Hintergrund die MP3 Tags auslesen sollte. Hatte da dieselben Probleme. Habe auch versucht den Code aufs Wesentliche zu reduzieren und Mutexes zu benutzen aber vergebens. Nur mit Threadsafe funktioniert die Anwendung einwandfrei.