Seite 1 von 1

Thread darf nicht mit globaler Liste arbeiten!?

Verfasst: 19.09.2014 18:11
von es_91
Hi.

Also ich habe da einen Thread, der auf eine globale, vor dem Threadstart definierte, strukturierte verknüpfte Liste zugreift. Manchmal geht alles gut. Doch manchmal hängt sich mein Programm auf und es wird im Hauptprogramm ein Fehler gebracht, die verknüfte Liste hätte kein aktuelles Element. Und das, obwohl ich nirgendswo einen DeleteElement()-Befehl verwende!

Wie kann das sein? Habt Ihr irgendwelche Erfahrungen mit so einer Situation gemacht? Könnt Ihr Hilfestellungen geben?

Dankend,

euer es_91.

Re: Thread darf nicht mit globaler Liste arbeiten!?

Verfasst: 19.09.2014 18:21
von ts-soft
Erstelle einen Mutex und Lock die Liste vor dem Zugriff!

Globale Listen oder ähnlich sind doch nicht gegen Threads gefeit :wink: , ganz im Gegenteil.

Re: Thread darf nicht mit globaler Liste arbeiten!?

Verfasst: 19.09.2014 18:34
von GPI
Die Compiler-Option für threadsichere Routinen kann auch hilfreich sein. Hilft natürlich nicht, wenn gleichzeitig das aktuelle Element geändert wird.

Re: Thread darf nicht mit globaler Liste arbeiten!?

Verfasst: 19.09.2014 18:34
von es_91
Hallo, ts-soft!

Mache ich da etwas falsch?

Code: Alles auswählen

Global Newlist iListe. i()

Global iMutex. i

Procedure THREAD(Void. i)
  
  Repeat
    
    Delay(1)
    
    LockMutex (iMutex)
    
    ForEach iListe ()
      
      If IsGadget (iListe ())
        
        Break
        
      EndIf
    
    Next
    
    UnlockMutex (iMutex)
    
  ForEver
  
EndProcedure

AddElement (iListe ())

iMutex = CreateMutex ()

iThread = CreateThread (@ THREAD(), #Null)

; ...
...es geht nämlich immer noch nicht.

/EDIT: Code geändert! (Global-Definition für 'iMutex' hinzugefügt)

/EDIT4: 'Next' eingefügt (siehe weiter unten).

Re: Thread darf nicht mit globaler Liste arbeiten!?

Verfasst: 19.09.2014 18:36
von es_91
GPI hat geschrieben:Die Compiler-Option für threadsichere Routinen kann auch hilfreich sein. Hilft natürlich nicht, wenn gleichzeitig das aktuelle Element geändert wird.
Bei mir wird das aktuelle Element nicht geändert, nur abgefragt (über 'IsGadget()'). und die Threadsicherheit habe ich vor einiger Zeit eingeschalten.

Re: Thread darf nicht mit globaler Liste arbeiten!?

Verfasst: 19.09.2014 18:55
von ts-soft
Globale Mutexvar am Anfang des Codes, vor Threadprocedure.
Lock mutex bei nutzung der Liste, im Thread oder im Mainprogramm!
Unlockmutex danach, also immer schön freigeben.

Die CompilerOption Threadsafe ist empfehlenswert, die Macht die Strings Threadsicher,
d. h. zum Beispiel auch Strings in Listen.

Re: Thread darf nicht mit globaler Liste arbeiten!?

Verfasst: 19.09.2014 21:24
von NicTheQuick
Das 'UnlockMutex()' muss natürlich nach das 'ForEver', da das 'LockMutex()' auch vor dem 'ForEach' ist.

Re: Thread darf nicht mit globaler Liste arbeiten!?

Verfasst: 19.09.2014 21:32
von ts-soft
NicTheQuick hat geschrieben:Das 'UnlockMutex()' muss natürlich nach das 'ForEver', da das 'LockMutex()' auch vor dem 'ForEach' ist.
Guck mal genau hin, da fehlt ein "Next". Wenn das vor UnlockMutex() kommt, ist das schon okay.

Re: Thread darf nicht mit globaler Liste arbeiten!?

Verfasst: 19.09.2014 22:04
von es_91
Ai, so viele Fehler von mir... :doh:

Aber was habe ich denn nun eigentlich falsch gemacht? Mein Code demonstriert doch, so wie ich es sehe, genau das, was ts-soft mir geraten hat. :|

Re: Thread darf nicht mit globaler Liste arbeiten!?

Verfasst: 19.09.2014 22:09
von ts-soft
Wenn Du ihn ausführbar machst, bin ich gerne bereit ihn zu testen :wink:

Und bitte mit EnableExplicit wenn es geht :mrgreen: