ThreadCreate
Starts a user-defined procedure in a separate execution thread
Syntax
`
Declare Function ThreadCreate ( ByVal proc As Sub ( ByVal As Any Ptr ), ByVal param As Any Ptr = 0, ByVal stack_size As Integer = 0 ) As Any Ptr
`
Usage
`
result = ThreadCreate ( proc [, [ param ] [, stack_size ] ] )
`
Parameters
`proc`
A pointer to the `Sub` intended to work as a thread.
`param`
Optional Any Ptr argument for the `Sub` pointed to by `proc` (it can be a pointer to a structure or an array if more arguments are needed).
`stack_size`
Optional number of bytes to reserve for this thread's stack.
Return Value
Threadcreate returns an `Any Ptr` handle to the thread created, or the null pointer (0) on failure.
Description
The user function is started as a thread executes in parallel with the main part of the program. The OS achieves this by assigning it to a different processor if it exists, or using the waiting times in the main program.
Before closing, a program must wait for the termination of all the threads it has launched; see `ThreadWait`.
To avoid simultaneous access to shared resources from different threads, FreeBASIC implements mutexes, mutual exclusion locks that can be "owned" by a single thread when doing critical work. See `MutexCreate`, `MutexLock`, `MutexUnlock`, `MutexDestroy`.
On some systems, the stack automatically grows beyond `stack_size` if more space is needed; on others, this is the fixed maximum allowed. Behavior is undefined when more stack is used than the reserved size on systems where stacks are not able to grow.
Example
`
Dim Shared terminate As Integer = 0
Sub mythread (param As Any Ptr)
Dim As Double t = Timer
While( 1 )
Print "*";
'' pause for .1 second
While( Abs( Timer - t ) < .1 )
Sleep 1, 1
Wend
t = Timer
If terminate=1 Then Exit Sub
Wend
End Sub
Dim thread As Any Ptr
Dim b As Integer
Dim As Double t
Print "Main program prints dots"
Print "Thread prints asterisks"
thread = ThreadCreate( @mythread, 0 )
Print "Thread launched";
While b < 30
Print ".";
'' pause for .1 second
While( Abs( Timer - t ) < .1 )
Sleep 1, 1
Wend
t = Timer
b += 1
Wend
terminate=1
Print "Terminate launched";
ThreadWait (thread)
Print "Thread terminated"
Sleep
`
Dialect Differences

- Threading is not allowed in `-lang qb`

Platform Differences

- Threadcreate is not available with the DOS version / target of FreeBASIC, because multithreading is not supported by DOS kernel nor the used extender.
- In Linux the threads are always started in the order they are created, this can't be assumed in Win32. It's an OS, not a FreeBASIC issue.

Differences from QB

- New to FreeBASIC

See also

- `ThreadWait`
- `MutexCreate`
- `MutexLock`
- `MutexUnlock`
- `MutexDestroy`