THREADCALL
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgThreadCall
- 最后更新: 2020-11-12
在独立执行线程中启动带参数的用户自定义过程
- Threadcall 在内部使用 LibFFI:使用此功能编写程序的人员应注意遵守 LibFFI 的许可证,该许可证可在 http://github.com/atgreen/libffi/blob/master/LICENSE 找到。
语法
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 中,不支持
Stdcall和Pascal调用约定。 - 在 Windows 中,不支持
Pascal调用约定。
与QB的区别
- FreeBASIC 新增
参见
ThreadcreateThreadwaitMutexcreateMutexlockMutexunlockMutexdestroy
返回 目录