Thread + Timer = Crash?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: Thread + Timer = Crash?

BeitragDi, März 16, 2010 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich habe heute mit Threads angefangen. Nach langem Verzweifeln und keineAntwortimChatbekomm hab ich bemerkt, das es mit den Timern zusammen hängt, dass nix funktioniert.
Folgender Code sollte doch eigentlich problemlos funktionieren:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Local thread:TThread=CreateThread(RunningThread,Null)

Local timer:TTimer=CreateTimer(3)

Repeat
WaitTimer(timer)
Print "Main"
Forever

Function RunningThread:Object(data:Object)
Local thread_timer:TTimer=CreateTimer(6)
Repeat
WaitTimer(thread_timer)
Print "Thread"
Forever
End Function


Doch leider wird bei mir 2 mal Thread und ein mal Main ausgegeben, danach passiert nix mehr. Warum? Wenn ich den Timer im Thread gegen ein Delay austausche geht es perfekt. Bin ratlos. Ein Bug in BM oder ein Fehler von mir?

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Xeres

Moderator

BeitragDi, März 16, 2010 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist einer der Gründe, warum Threading in BM noch nicht wirklich genutzt wird.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

mpmxyz

BeitragDi, März 16, 2010 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
TTimer ist nicht threadsicher:
BlitzMax: [AUSKLAPPEN]
	Method Wait()
If Not _handle Return
Local n
Repeat
WaitSystem
n=_ticks-_wticks
Until n
_wticks:+n '<- :!: Ein ungesicherter Schreibzugriff auf ein Field! = :twisted:
Return n
End Method

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Der Eisvogel

BeitragDi, März 16, 2010 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie kann ich mir dann so einen Timer selber schreiben?
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

mpmxyz

BeitragDi, März 16, 2010 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt zwei Möglichkeiten.
Möglichkeit A:
einen Timer aus "Millisecs" und "Delay" basteln
Möglichkeit B:
Copy&Paste aus brl.Timer
pro Timer einen "Mutex" erstellen
an zwei Stellen - den Methoden "Wait" und "Fire" - jeweils die richtigen Mutex-Methoden anwenden.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Der Eisvogel

BeitragDi, März 16, 2010 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, danke.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Der Eisvogel

BeitragMi, März 17, 2010 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry für Doppelpost, aber ich habe jetzt ein Problem mit meinem selbst geschriebene Timer:
BlitzMax: [AUSKLAPPEN]
Type TTimerEx
Field frequence:Int
Field delaytime:Int
Field lastcall:Int

Method Wait()
Delay delaytime-(MilliSecs()-lastcall)
End Method

Function Create:TTimerEx(value:Int,mode:Int=0)
Local t:TTimerEx=New TTimerEx
If mode=0 Then
t.frequence=value
t.delaytime=Int(1000.0/value)
Else
t.delaytime=value
EndIf
End Function
End Type


Sobald ich da nun Wait() aufrufe, kommt bei Ausführen des Programm unabhängig von BM die Meldung:
Windows exception
Windows acces violation

Das Programm selbst läuft weiter, aber sobald ich bei der Meldung auf OK klicke beendet es sich. Was mache ich falsch? Sind Types selber auch nicht Threadsafe?

EDIT: oO, da in der Method, ist das da so wie beim Timer von BM auch ein ungesicherter Speicherzugriff? Liegt das daran?

Wenn dieser Doppelpost nicht berechtigt ist, dann bitte löschen.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

mpmxyz

BeitragMi, März 17, 2010 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Wird das Field "lastcall" auch überschrieben?
Wenn ja, muss dieses Überschreiben gesichert werden.
(Schreibzugriffe auf mehrfach genutzte Bereiche sind, wie schon einmal gesagt, böse!)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Der Eisvogel

BeitragMi, März 17, 2010 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Oops, hab ich vergessen jetzt hab ich es drinnen, aber der Fehler bleibt unverändert.

EDIT: Wie sichert man einen solchen Zugriff?
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

mpmxyz

BeitragMi, März 17, 2010 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Du erstellst für jeden Timer einen Mutex mit "CreateMutex".
Die kritische Wertzuweisung wird von "LockMutex" und "UnlockMutex" umschlossen.
Schaue dir am Besten die Beispiele in der Originalhilfe an. (Hot Docs hat bei mir keine Referenz für das Threadmodul erstellt.)
mfG
mpmxyz
Edit: Da scheint der Wurm drin zu sein. (oder eher ein Käfer...) Das Aufrufen einer einzelnen Methode ohne Inhalt sorgt schon für Probleme...
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Der Eisvogel

BeitragMi, März 17, 2010 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt siehts so aus:
BlitzMax: [AUSKLAPPEN]
Type TTimerEx
Field mutex:TMutex
Field frequence:Int
Field delaytime:Int
Field lastcall:Int

Method Wait()
LockMutex(Self.mutex)
Delay Self.delaytime-(MilliSecs()-Self.lastcall)
Self.lastcall=MilliSecs()
UnlockMutex(Self.mutex)
End Method

Function Create:TTimerEx(value:Int,mode:Int=0)
Local t:TTimerEx=New TTimerEx
LockMutex(t.mutex)
t.mutex=CreateMutex()
If mode=0 Then
t.frequence=value
t.delaytime=Int(1000.0/value)
Else
t.delaytime=value
EndIf
UnlockMutex(t.mutex)
End Function
End Type


Aber es kommt immernoch dieser Error.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

mpmxyz

BeitragMi, März 17, 2010 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
*husthust*
LockMutex vor CreateMutex?
kein Return bei "Create"?
"Traue keinem Code!" Wink
Dann hätte ich das zweite schneller gemerkt...
Teste die Sachen erst einmal im Main-Thread!
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Der Eisvogel

BeitragMi, März 17, 2010 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh,sry. Jetzt gehts danke.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BladeRunner

Moderator

BeitragDo, März 18, 2010 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
(Hot Docs hat bei mir keine Referenz für das Threadmodul erstellt.)

Such mal hier im Forum, ich hatte eine HotDocsversion eingestellt die mit dem Threaded-Mode klar kommt.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group