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?