Threads in B3D - Mit FastPointer

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

Pummelie

Betreff: Threads in B3D - Mit FastPointer

BeitragSo, Nov 28, 2010 1:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich das ganze als Mittel der Mittel für Multicore Nutzung sehe, dachte ich, ich mach mal ein kleines Tut, damit sich mehr Leute damit anfreunden.

Als erstes braucht ihr die FastPointer Lib hier: Download.

Einen Thread erstellen:
Und schon kanns los gehen.

Hier erstmal unsere Function
BlitzBasic: [AUSKLAPPEN]
Function Thread1(var%=0)
Local ms=MilliSecs()+1000,count
Repeat
count=count+1
If MilliSecs()>ms Then
fps=count
count=0
ms=MilliSecs()+1000
EndIf
Forever
End Function


Um einen Thread zu erstellen, brauchen wir erst einmal einen Pointer auf eine Funktion, die der Thread mal werden soll.
Diese bekommen wir so:
BlitzBasic: [AUSKLAPPEN]
Local pointer1 = FunctionPointer()
Goto skip1
Thread1()
.skip1

Thread1() ist die Funktion, die wir später als Thread aufrufen wollen.
Diese überspringen wir mit Goto, statt sie aus zu führen.
Die Funktion "FunctionPointer()" gibt den Pointer in die Variable pointer1.

Nun haben wir schonmal den benötigten Pointer auf unsere Funktion.

Den Thread starten wir dann mit:
BlitzBasic: [AUSKLAPPEN]
Local Thread1 = CreateThread(Pointer1, 0)


Jetzt könne wir ein Programm mit dem Thread, der diese Function darstellt bauen.
BlitzBasic: [AUSKLAPPEN]
Global fps
Graphics(800,600,32,2)
SetBuffer(BackBuffer())
Local pointer1 = FunctionPointer()
Goto skip1
Thread1()
.skip1
Local Thread1 = CreateThread(Pointer1, 0)
ClsColor(180,180,180)
Color(0,0,0)
SetFont(LoadFont("Consolas",20))
Repeat
Cls
Text(400,290,"Der Thread hat "+fps+" FPS",1,1)
Flip(1)
Until KeyDown(1)
FreeThread(Thread1)
End


Zuätzliche Info's über die Verwendung:
user posted imageKeine Zeichenbefehle, oder alle Zeichenbefehle. In 3D können Objekte modifiziert werden
user posted imageTimer verursachen Mav (verwende Delay)
user posted imageMehrere Schreibzugriffe auf eine Variable sind nicht möglich - am besten ihr verwendet globale zum sichern, das vom Threat kein Schreibzugriff statt findet, wenn ihr das nicht wollt
user posted imageKein Return, oder im Thread festgeletes Ende
user posted imageNicht nur End verwenden, vorher den Thread schließen
user posted imageKein Graphics ; RuntimeError oder sonstige Befehle, die ein Fenster aufrufen im Thread
user posted imageIn Maßen verwenden. Mehrer Threads schlagen schnell auf den Ram...

Feedback erwünscht Very Happy
It's done when it's done.

FireballFlame

BeitragSo, Nov 28, 2010 4:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ging das nicht nur bis Windows XP?
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Pummelie

BeitragSo, Nov 28, 2010 4:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Rennt ab Win 2000 bis Win 7...
It's done when it's done.

tft

BeitragSo, Nov 28, 2010 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

dem muss ich leider widersprechen. Es funktioniert nicht auf allen Rechnern. Wieso ist nicht genau bekannt.

Gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Dottakopf

BeitragDi, Nov 30, 2010 13:30
Antworten mit Zitat
Benutzer-Profile anzeigen
mir macht diese aussage irgendwie angst Smile
Zitat:
Timer verursachen Mav (verwende Delay)
Rechtschreibfehler gelten der allgemeinen Belustigung!

Pummelie

BeitragDi, Nov 30, 2010 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso?
It's done when it's done.

juse4pro

BeitragDo, Dez 30, 2010 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso das verängstigend sein sollte verstehe ich auch nicht.
Timer haben eine gemeinsame globale Variable (intern). Wenn mehrere Timer auf diese zeitgleich zugreifen machts BÄÄNG!
Delay macht dies nicht... Wink
Portfolio |LinkedIn |XING

Silver_Knee

BeitragFr, Dez 31, 2010 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
wie sieht's aus mitschreiben/lesen gleichzeitig. dürfte auch nicht gehen oder?

Pummelie

BeitragFr, Dez 31, 2010 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Das geleichzeite Schreiben verursacht einen MAV...
Lesen geht aber...
It's done when it's done.

Silver_Knee

BeitragFr, Dez 31, 2010 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
ja ich mein einer liest einer schreibt

Pummelie

BeitragFr, Dez 31, 2010 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso... damit hatte ichbisher noch keine Probleme.. kann aber auch Glück sein...

Sollte eigentlich gehen...
It's done when it's done.

mpmxyz

BeitragFr, Dez 31, 2010 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Lesen, während etwas geschrieben wird, ist auch problematisch. Welcher Wert soll denn dann ausgelesen werden? Der neue oder der alte Wert?
Das muss man daher auch sichern.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Pummelie

BeitragFr, Dez 31, 2010 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Also.. ich hab das jetz mal intensiv getestet...

Es besteht 2 Möglichkeiten die auftreten könne:
1. MAV

2. es wird immer 0 zurückgeliefert...


Eine Lösung wäre es vlt. den Threat in dieser Zeit an zu halten...
It's done when it's done.

Silver_Knee

BeitragSa, Jan 01, 2011 5:41
Antworten mit Zitat
Benutzer-Profile anzeigen
die frage wäre halt wie. muss man dazu mutexe setzen oder sowas oder kann man das irgendwie anders lösen

Pummelie

BeitragSa, Jan 01, 2011 6:10
Antworten mit Zitat
Benutzer-Profile anzeigen
FastPointer.decls hat Folgendes geschrieben:
PauseThread% (Thread%)
ResumeThread% (Thread%)


Damit könnte es gehen Wink
It's done when it's done.

Silver_Knee

BeitragSa, Jan 01, 2011 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
also soll ich wenn ich auf ne variable zugreife einfach alle threads anhalten die auf sie zugreifen könnten. is doch schon n bissl zweckentfremdet oder?

Alternative wäre halt wirklich Mutexe, wie in https://www.blitzforum.de/foru...hp?t=33059

Zitat:
.lib "Kernel32.dll"

CreateMutex%( lpMutexAttributes*, bInitialOwner%, lpName$ ) : "CreateMutexA"
OpenMutex%( dwDesiredAccess%, bInheritHandle%, lpName$ ) : "OpenMutexA"
ReleaseMutex%( hMutex% ) : "ReleaseMutex"


BlitzBasic: [AUSKLAPPEN]
;Constants
Const WAIT_OBJECT_0 = $00000080
Const WAIT_ABANDONED = $00000000
Const WAIT_TIMEOUT = $00000102
Const WAIT_FAILED = $FFFFFFFF

Type SECURITY_ATTRIBUTES
Field nLength
Field lpSecurityDescriptor.SECURITY_ATTRIBUTES;=.AnyType
Field bInheritHandle
End Type

;Functions - Mutex
Function BB_CreateMutex( Name$="" )
Local SA.SECURITY_ATTRIBUTES

SA = New SECURITY_ATTRIBUTES
SA\nLength = 8
SA\lpSecurityDescriptor = Null
SA\bInheritHandle = 0

Mutex = CreateMutex( SA, False, Name$ )

Return Mutex
End Function

Function BB_OpenMutex( Name$, Inherit=False, RequireFull=False )
Local SA.SECURITY_ATTRIBUTES

If RequireFull = False
Mutex = OpenMutex( 0, Inherit, Name )
Else
;MSDN:
;MUTEX_ALL_ACCESS (0x1F0001)
;All possible access rights for a mutex object.
;Use this right only if your application requires access beyond that granted by the standard access rights.
;Using this access right increases the possibility that your application must be run by an Administrator.
Mutex = OpenMutex( $1F0001, Inherit, Name )
EndIf
Return Mutex
End Function

Function BB_ReleaseMutex( hMutex )
ReleaseMutex( hMutex )
End Function

Function BB_WaitForMutex( hMutex, TimeOut=1000 )
Return WaitForSingleObject( hMutex, TimeOut )
End Function


BlitzBasic: [AUSKLAPPEN]
Global GemeinsameRessource
Global GemeinsameRessource_Mutex=BB_CreateMutex()
Function Thread()
Repeat
Delay Rand(100)
Select BB_WaitForMutex( GemeinsameRessource_Mutex);Warten bis das Mutex frei ist und es dann besetzen.
Case WAIT_OBJECT_0 ;Mutex kann nun benutzt werden

GemeinsameRessource=Rand(1000)

BB_ReleaseMutex( GemeinsameRessource_Mutex);Mutex frei machen, damit die anderen daran arbeiten können
Case WAIT_ABANDONED ;Mutex hat kein Parent und wurde abgesetzt
;Fehler Code
Case WAIT_TIMEOUT ;Mutex Waiting ist nicht erfolgreich gewesen
;Fehler Code
Case WAIT_FAILED ;Mutex exestiert nicht
;Fehler Code
End Select
Forever
End Function


wenn jetzt der Thread öfter gestartet wird und 2 Threads die GemeinsameRessource nutzen wollen, wartet immer ein Thread bis das Mutex wieder frei ist.

count-doku

BeitragSo, Mai 15, 2011 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

schöne Lib, versuche gerade damit einen Dateiserver zu schreiben.
Und wollte nur sagen, dass bei mir (WinXP) auch Timer ohne Probleme gehen.

Beispiel:
BlitzBasic: [AUSKLAPPEN]
Global fps,fps1,fps2,timer=CreateTimer(30),timer1=CreateTimer(45),timer2=CreateTimer(60)
Graphics(800,600,32,2)
SetBuffer(BackBuffer())
Local pointer1 = FunctionPointer()
Goto skip1
Thread1()
.skip1
Local pointer2 = FunctionPointer()
Goto skip2
Thread2()
.skip2
Local Thread1 = CreateThread(pointer1, 0)
Local Thread2 = CreateThread(pointer2, 0)
ClsColor(180,180,180)
Color(0,0,0)
SetFont(LoadFont("Consolas",20))
Local ms=MilliSecs()+1000,count
Repeat
count=count+1
If MilliSecs()>ms Then
fps=count
count=0
ms=MilliSecs()+1000
EndIf
Cls
Text(400,275,"Der MainThread hat "+fps+" FPS",1,1)
Text(400,290,"Der Thread1 hat "+fps1+" FPS",1,1)
Text(400,305,"Der Thread2 hat "+fps2+" FPS",1,1)
WaitTimer timer
Flip(0)
Until KeyDown(1)
FreeThread(Thread1)
FreeThread(Thread2)
End




Function Thread1(var%=0)
Local ms=MilliSecs()+1000,count
Repeat
count=count+1
If MilliSecs()>ms Then
fps1=count
count=0
ms=MilliSecs()+1000
EndIf
WaitTimer timer1
Forever
End Function
Function Thread2(var%=0)
Local ms=MilliSecs()+1000,count
Repeat
count=count+1
If MilliSecs()>ms Then
fps2=count
count=0
ms=MilliSecs()+1000
EndIf
WaitTimer timer2
Forever
End Function


Count-Doku

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group