External Thread for Blitz3D
Blitz3D Forums/Blitz3D Userlibs/External Thread for Blitz3D
| ||
| Hi, Threads here. You can use the full power of a C2D or C2Q. First test ;-) Blitz3D source
Global Value%
Global Pointer ; Init pointer
Global Pointer_setting=1
Gosub Test ; First call From Blitz3D for setting the pointer
Thread_Gosub(Pointer,1) ; Launch the thread. Number 1 to 8
While Not KeyDown(1)
a=a+1
Print "This is the main " + A
Print "Thread Value >>" + value
Delay 1
Wend
End
.Test
Pointer = Thread_Pointer()
If Pointer_setting Then
Pointer_setting=0
Return
EndIf
; Thread start here. This is a normal Gosub.
For Value=1 To 2000000000 ; !!!
; Delay 1
Next
Return
The DECLS .lib "BLITZ_THREAD.DLL" Thread_Pointer%() : "Thread_Pointer@0" Thread_Gosub(Adresse%,Thread_Number%) : "Thread_Gosub@8" And the .RAR http://www.zinfo972.net/pubip/BLITZ_THREAD.RAR Important post http://www.blitzbasic.com/Community/posts.php?topic=83420 |
| ||
| This seemed to quietly slip by but it is important, thread for Blitz3D! Excellent stuff, thank you! :D How about some functions for thread priorities, killing threads etc... please? |
| ||
| See topic - http://blitzbasic.com/Community/posts.php?topic=83420 |
| ||
| Hi, Knowledge must be shared. Here the source of the Dll in FreeBasic. Have fun... ;)
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' FreeBasic Thread for B3D (only???)
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
Sub mythread (param As UInteger Ptr)
Asm Call [param]
End Sub
Function FunctionPointer ALIAS "FunctionPointer" () AS UInteger Export
DIM StackPosition AS UInteger
DIM Adress AS UInteger
Asm
mov [StackPosition],esp
mov esp,ebp
Add esp,4
pop [Adress]
mov esp,[StackPosition]
End Asm
Return Adress - 8
END FUNCTION
SUB Call_THREAD ALIAS "Call_Thread" (BYVAL Adresse AS UInteger PTR) Export
Dim thread As Any Ptr
thread = ThreadCreate( @mythread,Adresse )
END Sub
.decls .lib "BLITZFB_THREAD.DLL" FunctionPointer%() : "FunctionPointer@0" Call_Thread(Adresse%) : "Call_Thread@4" B3d test
Global Pointer ; Init pointer
Global Pointer_setting=1
Gosub Test ; First call From Blitz3D for setting the pointer
Call_Thread(Pointer) ; Init the thread
While Not KeyDown(1)
a=a+1
Print "This is the main " + A
Delay 100
Wend
End
.Test
Pointer = FunctionPointer()
If Pointer_setting Then
Pointer_setting=0
Return
EndIf
; Thread here.
Print "Hello, I am called from the DLL with a THREAD"
For i=1000 To 10000
Delay 5
Print ">>>> CALL BY THE THREAD "+ i
Next
Return
|
| ||
| hi, thank's nice work! just a curiosity, the -8 in the return sentence, is it only valid on a 32 bit system? (I'm asuming Segment:Ofset far call 32:32 bits in total 8 bytes and for this you substract 8 forom the return address poped from the stack, isn't it? in a 64 system, should i try -16?) edit, nevermind, the return address is the address of the next instruction , 8 is the lenght of the Call blitz do to your function, or i'm wrong again? btw, wouldn't be used something like mov eax,ss:[esp+4] mov [address],eax with out modifing the stack (with pop) and having to save an restore it? Juan |
| ||
| "...edit, nevermind, the return address is the address of the next instruction , 8 is the lenght of the Call blitz do to your function, or i'm wrong again?..." It's right ;) Take a look here http://www.blitzbasic.com/Community/posts.php?topic=83420 ;) JP |
| ||
| thank's again, where am i when interesting threads are posted? Juan |
| ||
| Hi, thank's again, where am i when interesting threads are posted? Playing with a WiiMote? ;) I forgot this version. Somewhere on my hard drive. Best. Also works in debug mode. It is the source of the first post. ;) JP FreeBasic Dll
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'+ Blitz Thread Gosub +
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub mythread1 (param As Uinteger Ptr)
asm Call [param]
End Sub
'
Sub mythread2 (param As Uinteger ptr)
asm Call [param]
End Sub
'
Sub mythread3 (param As Uinteger ptr)
asm Call [param]
End Sub
'
Sub mythread4 (param As Uinteger ptr)
asm Call [param]
End Sub
'
Sub mythread5 (param As Uinteger ptr)
asm Call [param]
End Sub
'
Sub mythread6 (param As Uinteger ptr)
asm Call [param]
End Sub
'
Sub mythread7 (param As Uinteger ptr)
asm Call [param]
End Sub
'
Sub mythread8 (param As Uinteger ptr)
asm Call [param]
End Sub
'
Function Thread_Pointer alias "Thread_Pointer" () As Uinteger Export
dim StackPosition As Uinteger
dim Adress As Uinteger
Asm
mov [StackPosition],esp
mov esp,ebp
add esp,4
pop [Adress]
mov esp,[StackPosition]
End Asm
return Adress - 8
End Function
'
Sub Thread_Gosub Alias "Thread_Gosub" (Byval Adresse As Uinteger Ptr,Byval Thread_Number As Uinteger) Export
Dim thread1 As Any Ptr
Dim thread2 As Any Ptr
Dim thread3 As Any Ptr
Dim thread4 As Any Ptr
Dim thread5 As Any Ptr
Dim thread6 As Any Ptr
Dim thread7 As Any Ptr
Dim thread8 As Any Ptr
If Thread_Number=1 Then thread1 = threadcreate( @mythread1, Adresse )
If Thread_Number=2 Then thread2 = threadcreate( @mythread2, Adresse )
If Thread_Number=3 Then thread3 = threadcreate( @mythread3, Adresse )
If Thread_Number=4 Then thread4 = threadcreate( @mythread4, Adresse )
If Thread_Number=5 Then thread5 = threadcreate( @mythread5, Adresse )
If Thread_Number=6 Then thread6 = threadcreate( @mythread6, Adresse )
If Thread_Number=7 Then thread7 = threadcreate( @mythread7, Adresse )
If Thread_Number=8 Then thread8 = threadcreate( @mythread8, Adresse )
End Sub
'
.decls .lib "BLITZ_THREAD.DLL" Thread_Pointer%() : "Thread_Pointer@0" Thread_Gosub(Adresse%,Thread_Number%) : "Thread_Gosub@8" Blitz3d test
Global Value%
Global h%
Global e%=0
Global z#
Global Pointer ; Init pointer
Global Pointer_setting=1
Gosub Test ; First call From Blitz3D for setting the pointer
Pointer_setting=0
Thread_Gosub(Pointer,1) ; Init the thread. Number 1 to 8
While Not KeyDown(1)
If KeyDown(57) Then e=1 ; stop thread with'space'
a=a+1
h=Rnd(0,100)
Print "Main A " + A
Print "Thread Value >>" + value
Print "Thread Z# >>" + z
Delay 1 ; mini delai. !!!!
Wend
End
.Test
; Thread here. This is a normal Gosub.
Pointer = Thread_Pointer()
If Pointer_setting Then Return
While (Not e) ; Stop by the main.
z=z+0.1
value=value+1
If h<5 Then Print" Print here. Setting by the main !!!"
Wend
Return
|
| ||
| looking at the code, it looks great, but its late here... Can this be used, while loading game data, do a routine such as a rotating box for example in 3D? |