在单独的执行线程中启动具有参数的用户定义过程
Threadcall在内部使用LibFFI:使用此功能编写程序的人员应该小心遵守LibffI的许可证,可以在http://github.com/atgreen/libffi/blob/master/LICENSE上找到。
语法
用法
threadid = Threadcall subname ([paramlist ])
参数
subname
一个子程序的名称
paramlist
要传递给子程序的参数列表,与普通子调用一样。
返回值
Threadcall在创建的线程上返回
Any Ptr句柄,或者在失败时返回空指针(
0)。
说明
像
ThreadCreate一样,
Threadcall创建一个线程,该线程与调用它的代码同时运行。在几乎任何正常的sub调用之前放置“
Threadcall”,这个子在一个新的线程内被调用,并返回一个指向该线程的指针。
使用
Threadcall是创建线程的更简单的方法,并允许将数据传递到线程,而不会有全局变量或不是类型安全的指针。但是,
ThreadCreate更有效率,应该用于创建大量线程的程序。
虽然支持大多数子程序,但可能不会调用以下类型的子例程:
使用
Threadcall时,除非子程序没有参数,否则需要参数列表周围的括号。
例子
''线程使用“ThreadCall”
Sub thread( id As String, tlock As Any Ptr, count As Integer )
For i As Integer = 1 To count
MutexLock tlock
Print "线" & 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 "全部完成(并且没有Dim Shared!)"
方言差异
平台差异
- Threadcall不适用于FreeBASIC的DOS版本/目标,因为DOS内核和所使用的扩展程序不支持多线程。
- 在Linux中,线程始终按照创建的顺序启动,这在Win32中是不可以假定的。这是一个操作系统,而不是FreeBASIC的问题。
- 在Linux中,不支持STDCALL和Pascal调用约定
- 在Windows中,不支持Pascal调用约定
。
与QB差别
参考