PureBasic

CreateThread()

Синтаксис

Thread = CreateThread(@ProcedureName() , *Value)

Описание


Эта функция вызывает указанную процедуру '@ProcedureName()', которая будет выполнена параллельно основному коду программы, то есть в отдельном потоке. Таким образом, эта функция создаёт новый поток. Если поток создан корректно, функция возвратит идентификационный Номер потока, который может использоваться другими функциями этой библиотеки, такими как KillThread(), PauseThread(), и т.д.. Процедура, которую вы используете в качестве исполняемого кода потока, должна принимать только один параметр и не может ничего возвращать. Аргумент '*Value' функции CreateThread() передаётся как параметр процедуре потока. Если вы попытаетесь возвратить значение из вашего потока, оно просто потеряется.

Параметры

@ProcedureName() Адрес процедуры, которую вы хотите использовать в качестве кода нового потока. Не забудьте поставить символ '@' впереди имени и скобки '()' после имени, чтобы получить адрес процедуры.
*Value Это значение передаётся коду потока как параметр вашей функции. Вам решить, для чего это значение использовать.

Возвращаемое значение

Идентификационный Номер созданного потока, если новый поток создать невозможно - возвратится 0. Этот Номер необходим, если вы хотите контролировать поток с помощью других функций этой библиотеки.

Пример

Пример ниже показывает простейший способ создать поток, хотя в данном случае он ничего не делает.

Procedure YourProcedure(*Value)
    ; Переменная '*Value' будет содержать 23
EndProcedure

CreateThread(@YourProcedure(), 23)

Пример: Передача потоку нескольких параметров

Structure Person
    Name$
    Age.b
    Phone.l
EndStructure

Procedure Thread(*Parameters.Person)

    ; Отображаем параметры
    ;
    Debug *Parameters\Name$
    Debug *Parameters\Age
    Debug *Parameters\Phone

    ; Когда они нам больше не нужны, используем ClearStructure() чтобы гарантировать, что все динамические
    ; объекты (если есть) корректно удалены, и освободим блок динамической памяти
    ClearStructure(*Parameters, Person)
    FreeMemory(*Parameters)

EndProcedure

; Мы используем динамически выделенный блок, поэтому даже если мы обратимся к нему из процедуры,
; это будет работать. Блок памяти будет освобождён потоком.
;
*Parameters.Person = AllocateMemory(SizeOf(Person))
*Parameters\Name$ = "John"
*Parameters\Age  = 30
*Parameters\Phone = 10203040

CreateThread(@Thread(), *Parameters) ; Отправим потоку указатель на нашу структуру

Delay(2000)

Поддерживаемые OS

Все

<- CreateSemaphore() - Оглавление Thread - FreeMutex()->