THREADCREATE
来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgThreadCreate 最后更新: 2023-04-29
在独立执行线程中启动用户自定义过程。
语法
Declare Function ThreadCreate ( _
ByVal procptr As Sub ( ByVal userdata As Any Ptr ), _
ByVal param As Any Ptr = 0, _
ByVal stack_size As Integer = 0 _
) As Any Ptr用法:
result = ThreadCreate ( procptr [, [param] [, stack_size]] )参数
- procptr — 指向作为线程的
Sub的指针。该 sub 必须具有以下签名:Declare Sub myThread ( ByVal userdata As Any Ptr ) - param — 传递给线程 sub 的
userdata参数的Any Ptr参数。默认为0。 - stack_size — 可选的为此线程栈保留的字节数。
返回值
返回所创建线程的 Any Ptr 句柄,失败时返回 0。
说明
将 procptr 指向的 sub 作为线程启动。该线程与主程序并行执行。如果有多个处理器,操作系统会将其分配到不同的处理器上;否则在单个处理器上时间片轮转。
执行顺序: 无法保证线程的执行或启动顺序。
清理: 程序应对每个创建的线程调用 ThreadWait 或 ThreadDetach 以释放系统资源。
数据交换: 要在线程之间安全地交换数据,请使用互斥锁(MutexCreate、MutexLock、MutexUnlock、MutexDestroy)。
栈大小: stack_size 可更改线程的栈大小(从系统默认值)。在 Linux 上,栈可以超过 stack_size;在 Win32 上是固定的最大值。
注意: 即使未使用,userdata 参数在线程 sub 声明中始终是必需的。未使用时,ThreadCreate 中的 param 可以省略或传 0。
示例
示例1:使用互斥锁进行线程同步
vb
Const MAX_THREADS = 10
Dim Shared As Any Ptr ttylock
Sub teletype( ByRef text As String, ByVal x As Long, ByVal y As Long )
MutexLock ttylock
For i As Integer = 0 To (Len(text) - 1)
Locate x, y + i
Print Chr(text[i])
Sleep 25, 1
Next
MutexUnlock ttylock
End Sub
Sub thread( ByVal userdata As Any Ptr )
Dim As Integer id = CInt(userdata)
teletype "Thread (" & id & ").........", 1 + id, 1
End Sub
ttylock = MutexCreate()
Dim As Any Ptr handles(0 To MAX_THREADS-1)
For i As Integer = 0 To MAX_THREADS-1
handles(i) = ThreadCreate(@thread, CPtr(Any Ptr, i))
If handles(i) = 0 Then
Print "Error creating thread:"; i
Exit For
End If
Next
For i As Integer = 0 To MAX_THREADS-1
If handles(i) <> 0 Then ThreadWait(handles(i))
Next
MutexDestroy(ttylock)示例2:简单线程
vb
Sub mythread(param As Any Ptr)
For i As Integer = 0 To 29
Print "*";
Sleep CInt(Rnd() * 100), 1
Next
End Sub
Randomize(Timer())
Dim As Any Ptr thread = ThreadCreate(@mythread, 0)
For i As Integer = 0 To 29
Print ".";
Sleep CInt(Rnd() * 100), 1
Next
ThreadWait(thread)
Print
Sleep方言差异
- 在
-lang qb方言中不允许使用线程。
平台差异
- 在 FreeBASIC 的 DOS 版本/目标中不可用(DOS 不支持多线程)。
- 在 Linux 中,线程按创建顺序启动;在 Win32 中不保证此顺序。
与QB的区别
- FreeBASIC 新增。