type TThreadFunc : Function(Parameter : Pointer) : Integer;
Тип TThreadFunc определяет функцию, а не данные. Эта функция обычно используется как параметр для запроса функции 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;
showMsgFunc : TThreadFunc;
begin
// Установите поточную функцию
showMsgFunc := Addr(ShowMsg);
// Устанавливаем наши отображаемые сообщения
msg1.thread := 1;
msg1.msg := 'Hello World';
msg2.thread := 2;
msg2.msg := 'Goodbye World';
// Запуск выполнения первого потока, спрашивающего имя пользователя
thread1 := BeginThread(nil,
0,
showMsgFunc,
Addr(msg1),
0,
id1);
// Спрашиваем также и фамилию
thread2 := BeginThread(nil,
0,
showMsgFunc,
Addr(msg2),
0,
id2);
// Гарантируйте, что потоки будут закрыты только когда всё сделано
ShowMessagePos('Нажмите это, когда другие диалоги закончились.', 200, 300);
// Наконец, очищаем, закрывая потоки
CloseHandle(thread1);
CloseHandle(thread2);
end;
end.
|