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 создает поток, который выполняется в то же время, как и код, вызывающий его. Размещая "Threadcall" - это практически любой нормальный вызов процедуры. Процедура вызывается внутри нового потока и возвращает указатель на поток.

Используя Threadcall - это более простой метод создания потоков , позволяющий получать данные для передачи в поток без глобальных переменных или указателей, которые не являются строго типизированными. Однако, ThreadCreate является более эффективным и должен использоваться для программ, с созданием большого числа потоков.

Хотя большинство подпрограмм поддерживаются,  следующие типы подпрограмм не могут быть вызваны:
    • Подпрограммы, использующие Переменные аргументы
    • Подпрограммы с Union, которые передаются по ByVal
    • Подпрограммы с пользовательскими типами, содержащие union, массивы, строки или битовые поля, которые передаются по 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 "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!)"


Различия диалектов

  • Многопоточность не допускается в диалекте -lang qb.

Различия платформ

  • Threadcall не доступна в версии DOS FreeBASIC, потому что многопоточность не поддерживается ядром DOS.
  • В Linux потоки всегда запускаются в том порядке, котором они были созданы , это нельзя предположить (угадать) в Win32. Это вопрос операционных систем, а не FreeBASIC.
  • В Linux  stdcall и pascal конвенции вызова не поддерживаются
  • в Windows  pascal конвенция вызова не поддерживается

Отличия от QB

  • Новое в FreeBASIC

См. также