Seite 1 von 2

Thread Problem(Invalid memory access)

Verfasst: 22.08.2009 16:57
von Cornii
Hallo

ich hab ein kleines Problem.
Mein Programm läuft mit insgesamt 3 Threads. Alle diese Threads benutzen eine Funktion die einen Text in eine Log-Datei schreibt.
Mein Problem ist dass es manchmal einen "Invalid memory access" in dieser Funktion gibt.
Ich vermute das liegt daran wenn 2 oder mehr Threads gleichzeitig diese Funktion ausführen.
Gibt es eine Möglichkeit irgendwas dagegen zu tun?

Danke,
Cornii

Verfasst: 22.08.2009 17:02
von cxAlex
Ohne Code ist da nicht viel zu machen, vor allem bei Threads, poste ihn bitte mal.

Gruß, Alex

Verfasst: 22.08.2009 17:12
von Cornii

Code: Alles auswählen

Procedure WriteLog(TxT.s)
Time = FormatDate("%hh:%ii:%ss", Date())
PrintN("["+Time+"] " + TxT)
WriteStringN(1,"["+Time+"] " + TxT)
EndProcedure
Das wird von den anderen Threads ganz normal aufgerufen

Verfasst: 22.08.2009 17:15
von cxAlex
Und was wird im Main - Thread gemacht? Ein lauffähiger Code incl. Calls wäre praktisch. Ansonsten siehts so aus als würde sich das per Mutex lösen lassen.

Verfasst: 22.08.2009 17:16
von DarkDragon
Cornii hat geschrieben:

Code: Alles auswählen

Procedure WriteLog(TxT.s)
Time = FormatDate("%hh:%ii:%ss", Date())
PrintN("["+Time+"] " + TxT)
WriteStringN(1,"["+Time+"] " + TxT)
EndProcedure
Das wird von den anderen Threads ganz normal aufgerufen
Naja, Time ist bei dir nicht deklariert.

Code: Alles auswählen

Global LogMutex
LogMutex = CreateMutex()

Procedure WriteLog(TxT.s)
  Protected Time.s
  
  Time = FormatDate("%hh:%ii:%ss", Date())
  
  LockMutex(LogMutex)
  PrintN("["+Time+"] " + TxT)
  WriteStringN(1,"["+Time+"] " + TxT)
  UnlockMutex(LogMutex)
EndProcedure
Das wäre eine Möglichkeit, ich würde jedoch zu einem Queue Container raten, der in einem ganz anderen Thread abgearbeitet wird.

Verfasst: 22.08.2009 17:17
von cxAlex
DarkDragon hat geschrieben: Das wäre eine Möglichkeit, ich würde jedoch zu einem Queue Container raten, der in einem ganz anderen Thread abgearbeitet wird.
Jup, auch das ist möglich:

http://www.purebasic.fr/german/viewtopic.php?t=19188

Verfasst: 22.08.2009 17:19
von DarkDragon
cxAlex hat geschrieben:
DarkDragon hat geschrieben: Das wäre eine Möglichkeit, ich würde jedoch zu einem Queue Container raten, der in einem ganz anderen Thread abgearbeitet wird.
Jup, auch das ist möglich:

http://www.purebasic.fr/german/viewtopic.php?t=19188
Hey das hab ich ja noch garnicht gesehen. Ich verwende das genau unter dem gleichen Namen unter C++ (und Java) aber mit eigenem Code und ohne Prioritätsklassen :lol: . Sowas hab ich in meiner GPUCalc lib auch in einfacher Form verwendet.

Verfasst: 22.08.2009 17:27
von Cornii
Hi

Danke für eure Antworten.
Mutex war die Lösung.
Time war übrigens als Global deklariert.

Verfasst: 22.08.2009 18:41
von NicTheQuick
Und sichere Threads sind auch in der Projekt-Optionen aktiviert? Wegen den Strings?

Verfasst: 22.08.2009 19:06
von Cornii
Nein war nicht aktiviert.
Jetzt hab ich das mal aktiviert und das Mutex wieder weggemacht und jetzt gehts trotzdem ohne Fehler.

Was macht diese Option?