Skip to content

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 作为线程启动。该线程与主程序并行执行。如果有多个处理器,操作系统会将其分配到不同的处理器上;否则在单个处理器上时间片轮转。

执行顺序: 无法保证线程的执行或启动顺序。

清理: 程序应对每个创建的线程调用 ThreadWaitThreadDetach 以释放系统资源。

数据交换: 要在线程之间安全地交换数据,请使用互斥锁(MutexCreateMutexLockMutexUnlockMutexDestroy)。

栈大小: 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 新增。

参见

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系