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