Запускает процедуру, определенную пользователем, с параметрами в отдельном
выполняемом потоке
Threadcall внутренне использует LibFFI :
люди, которые пишут программы, используя эту функцию, должны быть
осторожны, чтобы следовать лицензии LibFFI, которую можно найти на сайте: http://github.com/atgreen/libffi/blob/master/LICENSE.
Синтаксис
Использование
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
См. также