Threadcall
 
在单独的执行线程中启动具有参数的用户定义过程

Threadcall在内部使用LibFFI:使用此功能编写程序的人员应该小心遵守LibffI的许可证,可以在http://github.com/atgreen/libffi/blob/master/LICENSE上找到。

语法

Function Threadcall subname ([paramlist ]) As Any Ptr

用法

threadid = Threadcall subname ([paramlist ])

参数

subname
一个子程序的名称
paramlist
要传递给子程序的参数列表,与普通子调用一样。

返回值

Threadcall在创建的线程上返回Any Ptr句柄,或者在失败时返回空指针(0)。

说明

ThreadCreate一样,Threadcall创建一个线程,该线程与调用它的代码同时运行。在几乎任何正常的sub调用之前放置“Threadcall”,这个子在一个新的线程内被调用,并返回一个指向该线程的指针。

使用Threadcall是创建线程的更简单的方法,并允许将数据传递到线程,而不会有全局变量或不是类型安全的指针。但是,ThreadCreate更有效率,应该用于创建大量线程的程序。

虽然支持大多数子程序,但可能不会调用以下类型的子例程:
    • 使用可变参数的子程序
    • 具有通过的工会的子程序ByVal
    • 带有用户类型的子例程,包含通过的联合,数组,字符串或位域ByVal

使用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!)"


方言差异

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

平台差异

  • Threadcall不适用于FreeBASIC的DOS版本/目标,因为DOS内核和所使用的扩展程序不支持多线程。
  • 在Linux中,线程始终按照创建的顺序启动,这在Win32中是不可以假定的。这是一个操作系统,而不是FreeBASIC的问题。
  • 在Linux中,不支持STDCALLPascal调用约定
  • 在Windows中,不支持Pascal调用约定 。

与QB差别

  • 新的FreeBASIC

参考