Delphi-Help

BeginThread

Печать
Рейтинг пользователей: / 1
ХудшийЛучший 

BeginThread

Описание

Функция BeginThread начинает отдельный независимый от основного кода 'поток' выполнения кода.
Вы можете иметь больше чем один поток - каждый поток является другой, независимой разновидностью основной линии выполнения программы.
При вызове функции BeginThread, вы создаете новый поток, который выполняет указанную функцию ThreadFunc.
Когда поток создан, он возвращает идентификатор потока в возвращаемом целом числе. Когда поток возвращается, вы должны вызвать функцию Windows CloseThread для освобождения ресурсов.
Каждый поток имеет такой же доступ к данным модуля как и основной поток программы. Большая осторожность должна быть уделена при доступе к данным, общедоступным между потоками.
Для обеспечения уникальных переменных для каждого потока, используйте определение модуля ThreadVar, как в примере.
Вы можете передать данные каждому потоку через указатель Param, как в примере.
Атрибуты SecurityAttr, StackSize и CreateFlags выходят за области этой статьи.

Пример кода

// Полный код Модуля.
// -----------------------------------------------------------
// Вы должны поместить этот код в модуль с именем 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
Нажмите это, когда другие диалоги завершатся.

Примечание

Класс TThread обеспечивает дополнительный метод выполнения потока.
Пронизывание это сложная тема - этот раздел касается только поверхности. Такие вопросы как синхронизации потоков, и параллельного управления доступа к данным выходят за области Основ Delphi.

Смотрите также: Американский Пирог: Все в сборе

Авторизация



Счетчики