Функція BeginThread в Delphi починає окремий потік виконання коду.
System unit
function BeginThread (SecurityAttr : Pointer; StackSize : LongWord; ThreadFunc : TThreadFunc; Param : Pointer; CreateFlags : LongWord; var ThreadId : LongWord) : Integer;
Функція BeginThread починає окремий незалежний від основного коду потік виконання коду.
Ви можете мати більше одного потоку – кожен потік є іншим, незалежним різновидом основної лінії виконання програми.
При виклику функції BeginThread, ви створюєте новий потік, який виконує вказану функцію ThreadFunc.
Коли потік створений, він повертає ідентифікатор потоку в цілому числі, що повертається. Коли потік повертається, ви повинні викликати Windows CloseThread для звільнення ресурсів.
Кожен потік має такий самий доступ до даних модуля, як і основний потік програми. Велику обережність слід приділяти при доступі до даних, загальнодоступних між потоками.
Для забезпечення унікальних змінних для кожного потоку використовуйте визначення модуля ThreadVar (як у прикладі).
Ви можете передати дані кожному потоку через покажчик Param (як у прикладі).
Атрибути SecurityAttr, StackSize та CreateFlags виходять за сферу цієї статті.
Примітка.
Клас TThread забезпечує додатковий метод виконання потоку.
Пронизування це складна тема – цей розділ стосується лише поверхні. Такі питання як синхронізації потоків, і паралельного управління доступу до даних виходять за області Основ Delphi.
Функція BeginThread: Простий приклад, який показує багато діалогів
// Повний код Модуля.
// -----------------------------------------------------------
// Ви повинні помістити цей код у модуль з ім'ям Unit1 і формою
// названа Form1, яка має подію OnCreate названа FormCreate.
unit Unit1;
interface
uses
Forms, Dialogs, Windows, SysUtils;
type
TMsgRecord = record
thread : Integer;
msg : string[30];
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
Implementation
{$R *.dfm} // Увімкнення визначень форми
ThreadVar // Ми повинні дозволити кожному потоку його власні зразки
// переданого змінній запису
msgPtr : ^TMsgRecord;
// Приватна процедура потоку для показу рядка
function ShowMsg(Parameter : Pointer) : Integer;
begin
// Установка 0 значення, що повертається
Result := 0;
// Вказуємо покажчик на передані дані
// Зауважте, що кожен потік має окрему копію msgPtr
msgPtr := Parameter;
// Показ цього повідомлення
ShowMessagePos('Thread '+IntToStr(msgPtr.thread)+' '+msgPtr.msg,
200*msgPtr.thread, 100);
// Кінець потоку
EndThread(0);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
id1, id2 : LongWord;
thread1, thread2 : Integer;
msg1, msg2 : TMsgRecord;
begin
// встановлення наших повідомлень, що відображаються
msg1.thread := 1;
msg1.msg := 'Hello World';
msg2.thread := 2;
msg2.msg := 'Goodbye World';
// Запуск першого виконання потоку, який запитує ім'я користувача
thread1 := BeginThread(nil,
0,
Addr(ShowMsg),
Addr(msg1),
0,
id1);
// І також питаємо прізвище
thread2 := BeginThread(nil,
0,
Addr(ShowMsg),
Addr(msg2),
0,
id2);
// Гарантуйте, що потоки будуть закриті лише коли все зроблено
ShowMessagePos('Press this when other dialogs finished.', 200, 300);
// Нарешті, забираємось, закриваючи потоки
CloseHandle(thread1);
CloseHandle(thread2);
end;
end.
Результат
Три діалоги відобразять:
Thread 1 Hello World
Thread 2 Goodbye Word
Натисніть на це, коли інші діалоги завершаться.
Подібні функції, процедури та команди
EndThread — закінчує потік із кодом завершення.
IsMultiThread — повертає True, якщо код виконує безліч потоків.
ThreadVar — визначає змінні, які отримує кожен потік як окремий екземпляр.
