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
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

. 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?