Threads aus Modulen -> Wann werden die gekillt?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

M0rgenstern

Betreff: Threads aus Modulen -> Wann werden die gekillt?

BeitragDo, Nov 22, 2012 23:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,
Ich habe ein kleines Problem:
Wenn ich das Spiel, das ich momentan schreibe, öfter hintereinander kompiliere (also kompilieren, dann aus machen, etwas ändern, wieder kompilieren etc.), dann wird mein PC irgendwann extrem langsam. Und das ist so schlimm, dass ich ihn dann irgendwann neu starten muss.
Ich bin auf die Idee gekommen, dass es an einem meiner Module liegen könnte:
Ich habe mir einen Logger geschrieben, der Fehler in Dateien schreiben kann. Dieser läuft in einem extra Thread, damit man jederzeit einen Fehler schreiben kann.
Ich habe jetzt die Befürchtung, dass der Thread, wenn ich mein Spiel beende, nicht gekillt wird.
Kann mir bitte jemand sagen, wie das in BlitzMax mit den Threads aus Modulen geregelt ist?
Laufen die weiter, wenn das Programm, das sie aufgerufen hat, beendet wird oder nicht?

Lg, M0rgenstern

kog

BeitragDo, Nov 22, 2012 23:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm normalerweise werden die Threads zu den Programmen auch beendet wenn das Programm beendet wird, ich weiss jedoch nicht, wie es ist mit dem Aufräumen des Speicher bezüglich diesem Abbruch.

Hast du schonmal die gesamte Speicherauslastung des Computers angeschaut? Oder hast du ein Memoryleak in deinem Loggermodul?
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

M0rgenstern

BeitragFr, Nov 23, 2012 11:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey.
Das Verhalten ist halt sehr seltsam.
Die gesamte Auslastung liegt nur so bei 12-20%.
Aber mein Prozessor übertaktet halt bis zum Maximum. (Ich habe von Intel einen i7 der automatisch bis zu nem bestimmten Maximum übertaktet und auch ne Minianwendung die die Taktun angzeigt.)
Aber seitdem ich das Modul im Programm nicht mehr benutze, habe ich das Problem nicht mehr.
Ich finde das insofern seltsam, dass, selbst wenn der Thread nicht gekillt wird, er zumindest "schläft".

Der Code, der im Thread ausgeführt wird ist der folgende:
BlitzMax: [AUSKLAPPEN]
Function Update:Object(ptelLogger:Object)
'Run the function forever.
Repeat
'If there are messages in the queue, process them. Otherwise let the thread sleep.
If(Instance().__MessageQueue().Count() > 0) Then
'Lock the mutex.
While(Not TryLockMutex(Instance().__Mutex()))

Wend
'For each currently available message in the queue.
For Local index:Int = 0 Until Instance().__MessageQueue().Count()
'Dequeue the message.
Local MSG:TErrorMessage = TErrorMessage(Instance().__MessageQueue().Dequeue())
'Get the file to write in.
Local sFileToWriteIn:String = MSG.FileToWriteIn()
Local strm:TStream
'Decide if the file has to be created or just can be opened.
If(FileType(sFileToWriteIn) = 1) Then
strm = OpenFile(sFileToWriteIn)
'Jump to the end of the file.
strm.Seek(FileSize(sFileToWriteIn))
Else
strm = WriteFile(sFileToWriteIn)
EndIf
'Write the message in the file.
strm.WriteLine(MSG.ToString())
strm.Close()
Next
'Unlock the mutex.
UnlockMutex(Instance().__Mutex())
Else
Instance().__SetIsFinished(True)
'If there is no message in the queue, send the thread to sleep.
WaitCondVar(Instance().__CondVar(), Instance().__Mutex())
EndIf
Until (Instance().__IsFinished() And Instance().getShutDown())
End Function


Wenn ich mein Programm beende, rufe ich sogar shutDown() auf, wodurch getShutDown() auf true gesetzt wird.
Damit müsste ja dann die Schleife beendet werden. Die Liste wird auf jeden Fall leer, weil alle Fehler in die Datei geschrieben werden.

Lg,
M0rgenstern
 

PhillipK

BeitragFr, Nov 23, 2012 12:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich selbst habe nur einmal ein paar tests mit Threaded building gemacht.
Dh es gibt wohl fachlich besser geschulter leute, die dir deinen Code durchstöbern.

aber eins macht mir sorge:
BlitzMax: [AUSKLAPPEN]
				While(Not TryLockMutex(Instance().__Mutex()))

Wend


Warum verpackst du die ganze if abfrage nich so, das du diese "schleife in der schleife" vermeiden kannst?
Vielleicht und auch nur wirklich vielleicht, kann hier ein fehler stattfinden, je nachdem was existenz von der Mutex betrifft.
Meine erste idee ist: Hauptprozess wird gekillt, Thread versucht ein letztes mal "TryLockMutex", was fehlschlägt und frisst sich in der schleife fest.
Probier doch einfach mal, einen terminator mit folgendem mit in die schleife zu übernehmen:

BlitzMax: [AUSKLAPPEN]
				While(Not TryLockMutex(Instance().__Mutex()))
If Instance().__IsFinished() And Instance().getShutDown() Then ' hier mal alles "runterfahren" achso und der schönheit halber evtl noch cpu last sparen, weil diese schleife in der theorie unendlich lang laufen kann :P Auch wenn alles normal läuft^^
Wend


Vielleicht ist meine anmerkung auch einfach nur dumm und aus halbwissen zerfressen.. aber in einem normalen Singlethread programm passiert mir sowas ständig. Ich nenns 'While of death' ^^

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group