is possible make true dual-core or multi-core app ???
cpu multi-core , dual-core
BlitzMax Forums/BlitzMax Programming/cpu multi-core , dual-core No.
If you mean multithreading on several cores, I don't think so with current version of BlitzMax. If you mean let the code execute in both threads for calculations etc, this can be done with current BlitzMax version modifing the BMK utility to activate some speciffic flags when compiling C and C++ source code, and rebuilding all the modules. But I would wait to the next BlitzMax update as it is anounced for a wekk or so, and it is suposed to have some speed improvements, so maybe this is already done 'officially' (or maybe not, who knows!)
well it depends on the application...
For something to run on more than one core or cpu, the app has to be split up into parts. Each part is a thread. Or you could do it with multiple processes which are the same thing but are very isolated from each other. The o/s is then able to assign a thread or process to run on a core while another is running on another core. So long as the o/s supports threads and/or processes and also supports either multi-core CPU's or multiple CPU's, it should be able to schedule the threads/processes to individual cores/cpu's.
You will need your own or a third party's thread code in order to use threads in BlitzMax as it is not currently supported and you are totally on your own as to ensuring that it is `safe` to do so, there are a lot of issues to consider such as one thread changing data which another thread is assuming to be in a given state, plus issues with the garbage collector etc.
You could use the Free Process library but processes aren't as easy to use as threads. Whatever you do you'll have to do most of the work yourself.
I made my own script system and implemented my own scheduler to split up my scripts as threads as if running in multitasking, but it's really only one process with virtual threads, so it doesnt use any other cores. Would be really nice to have proper thread support.
You will need your own or a third party's thread code in order to use threads in BlitzMax as it is not currently supported and you are totally on your own as to ensuring that it is `safe` to do so, there are a lot of issues to consider such as one thread changing data which another thread is assuming to be in a given state, plus issues with the garbage collector etc.
You could use the Free Process library but processes aren't as easy to use as threads. Whatever you do you'll have to do most of the work yourself.
I made my own script system and implemented my own scheduler to split up my scripts as threads as if running in multitasking, but it's really only one process with virtual threads, so it doesnt use any other cores. Would be really nice to have proper thread support.
Flat out no. You cannot safely use threading in BlitzMax.
'it use dual-core ???
' blitzmax multitasking example
Strict
Global TaskManager:TTaskManager=New TTaskManager
Function task1()
Print "task1"
End Function
Function task2()
Print "task2"
End Function
TaskManager.StartTask 10,task1
TaskManager.StartTask 20,task2
Graphics 640,480
While WaitEvent()
DebugLog CurrentEvent.toString()
Wend
End
Type TTask
Field _hertz#
Field _count
Field _millis
Field _ticks
Field _callback()
Field _busy
Method Start(hz#,callback())
_count=0
_hertz=hz
_millis=MilliSecs()
_callback=callback
TaskManager._tasklist.AddFirst Self
End Method
Method Stop()
_hertz=0
TaskManager._tasklist.Remove Self
End Method
Method Update(ms)
Local count
If _busy Or _hertz=0 Return 'ignore if stopped or already in callback
_busy=True
count=((ms-_millis)*_hertz)/1000
If count>_count
_ticks:+1
_count=count
_callback()
EndIf
_busy=False
End Method
End Type
Type TTaskManager
Global _tasklist:TList
Global _timer:TTimer
Global _event:TEvent
Method New()
_tasklist=New TList
_event=CreateEvent( EVENT_TIMERTICK,Null,0 )
AddHook EmitEventHook,hook
_timer=CreateTimer(100,_event)
End Method
Function hook:Object( id,data:Object,context:Object )
Local ms
Local t:TTask
If data<>_event Return data
ms=MilliSecs()
For t=EachIn _tasklist
t.Update(ms)
Next
End Function
Method StartTask:TTask( hertz#,callback() )
Local t:TTask
t=New TTask
t.Start hertz,callback
Return t
End Method
End Type
' blitzmax multitasking example
Strict
Global TaskManager:TTaskManager=New TTaskManager
Function task1()
Print "task1"
End Function
Function task2()
Print "task2"
End Function
TaskManager.StartTask 10,task1
TaskManager.StartTask 20,task2
Graphics 640,480
While WaitEvent()
DebugLog CurrentEvent.toString()
Wend
End
Type TTask
Field _hertz#
Field _count
Field _millis
Field _ticks
Field _callback()
Field _busy
Method Start(hz#,callback())
_count=0
_hertz=hz
_millis=MilliSecs()
_callback=callback
TaskManager._tasklist.AddFirst Self
End Method
Method Stop()
_hertz=0
TaskManager._tasklist.Remove Self
End Method
Method Update(ms)
Local count
If _busy Or _hertz=0 Return 'ignore if stopped or already in callback
_busy=True
count=((ms-_millis)*_hertz)/1000
If count>_count
_ticks:+1
_count=count
_callback()
EndIf
_busy=False
End Method
End Type
Type TTaskManager
Global _tasklist:TList
Global _timer:TTimer
Global _event:TEvent
Method New()
_tasklist=New TList
_event=CreateEvent( EVENT_TIMERTICK,Null,0 )
AddHook EmitEventHook,hook
_timer=CreateTimer(100,_event)
End Method
Function hook:Object( id,data:Object,context:Object )
Local ms
Local t:TTask
If data<>_event Return data
ms=MilliSecs()
For t=EachIn _tasklist
t.Update(ms)
Next
End Function
Method StartTask:TTask( hertz#,callback() )
Local t:TTask
t=New TTask
t.Start hertz,callback
Return t
End Method
End Type
'it use dual-core ???
No. ' blitzmax multitasking example
No. Where there's a will there's a way, guys, come on. Just saying no is not helpful.
Where there's a will there's a way, guys, come on.
No there isn't. Short of driving over to Marks house and threatening him at gunpoint, to include this functionality in a future'ish release there is no practical way to write a multi-kernel-threaded program in BlitzMAX. BlitzMAX does not support the creation (forking) of threads, nor does BlitzMAX provide a thread synchronization mechanism (like a monitor) to resolve race situations and prevent deadlocks. Just saying no is not helpful.
Well, helpful or not, it happens to be the truth.If there was a reliable way to do it, it would have been done already. The only solution I've found is to make a separate program in another language that supports threads and does provide a synchronization mechanism (or write your own). However by the time you finish writing all that, and the boilerplate code that goes with it, you may as well switch to that language entirely, as there is no longer a compelling reason to use BlitzMAX.
Write 2 apps that communicate over 127.0.0.1.
Ethernet? Wouldn't that mean you have overhead for sending and receiving the data? Does it work on the same computer without a network?
if you're trying to do it with 2 apps, I would recomend you to use pipes.
Pipes? Tell me more about them and how to use them with blitzmax :)
Is this the stuff in PUB.FreeProcess?
Yes, it is on freeprocess. Pipes are a stream to comunicate 2 apps, you can see, as instance, how the debuger works in the MaxIDE to get and send data to the hosted debuged application.