Skip to content

THREADCALL


在独立执行线程中启动带参数的用户自定义过程

语法

function Threadcall subname([paramlist]) as any ptr

用法

threadid = Threadcall subname([paramlist])

参数

subname

子程序的名称

paramlist

传递给子程序的参数列表,与普通 sub 调用相同。

返回值

Threadcall 返回所创建线程的 any ptr 句柄,失败时返回空指针(0)。

说明

Threadcreate 类似,Threadcall 创建一个与调用它的代码同时运行的线程。通过在几乎任何对 sub 的普通调用前加上 "Threadcall",该 sub 将在新线程内被调用,并返回该线程的指针。

使用 Threadcall 是创建线程的更简单方法,允许在不使用全局变量或非类型安全指针的情况下向线程传递数据。但是,Threadcreate 更为高效,应在创建大量线程的程序中使用。

虽然大多数子程序都受支持,但以下类型的子程序可能无法调用:

  • 使用可变参数的子程序。
  • 以联合体(union)作为参数传递的子程序。
  • 以包含联合体、数组、字符串或位字段的用户类型作为参数传递的子程序。

使用 Threadcall 时,除非子程序没有参数,否则参数列表周围的括号是必需的。

警告:

  • 目前当 Threadcall 涉及向线程传递参数时,不保证在 Threadcall 语句结束后相应数据仍然有效(直到线程启动为止)。

  • 这可能导致不良行为:

  • 请参见下面的示例,其中未显示的参数 id 似乎是字符串参数被过早销毁的结果(在 fbc 版本 >= 1.00 时可见)。

  • 在参数声明中用 id As Zstring 替换 id As String 似乎可以解决传递此参数时的问题。

  • 因此,目前更建议使用 Threadcreate(100% 安全)代替。

示例

start GeSHi

vb
'' Threading using "ThreadCall"

Sub thread( id As String, tlock As Any Ptr, count As Integer )
    For i As Integer = 1 To count
        MutexLock tlock
        Print "thread " & id;
        Locate , 20
        Print i & "/" & count
        MutexUnlock tlock
    Next
End Sub

Dim tlock As Any Ptr = MutexCreate()
Dim a As Any Ptr = ThreadCall thread("A", tlock, 6)
Dim b As Any Ptr = ThreadCall thread("B", tlock, 4)
ThreadWait a
ThreadWait b
MutexDestroy tlock
Print "All done (and without Dim Shared!)"

end GeSHi

方言差异

  • -lang qb 方言中不允许使用线程。

平台差异

  • Threadcall 在 FreeBASIC 的 DOS 版本/目标中不可用,因为 DOS 内核及所用的扩展器不支持多线程。
  • 在 Linux 中,线程始终按创建顺序启动,在 Win32 中不能作此假设。这是操作系统问题,而非 FreeBASIC 问题。
  • 在 Linux 中,不支持 StdcallPascal 调用约定。
  • 在 Windows 中,不支持 Pascal 调用约定。

与QB的区别

  • FreeBASIC 新增

参见

  • Threadcreate
  • Threadwait
  • Mutexcreate
  • Mutexlock
  • Mutexunlock
  • Mutexdestroy

返回 目录

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