Thread Problem(Invalid memory access)

Anfängerfragen zum Programmieren mit PureBasic.
Cornii
Beiträge: 4
Registriert: 22.08.2009 16:47

Thread Problem(Invalid memory access)

Beitrag 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
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Ohne Code ist da nicht viel zu machen, vor allem bei Threads, poste ihn bitte mal.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Cornii
Beiträge: 4
Registriert: 22.08.2009 16:47

Beitrag 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
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Cornii
Beiträge: 4
Registriert: 22.08.2009 16:47

Beitrag von Cornii »

Hi

Danke für eure Antworten.
Mutex war die Lösung.
Time war übrigens als Global deklariert.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Und sichere Threads sind auch in der Projekt-Optionen aktiviert? Wegen den Strings?
Cornii
Beiträge: 4
Registriert: 22.08.2009 16:47

Beitrag 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?
Antworten