Delphi-Help

  • Increase font size
  • Default font size
  • Decrease font size

ThreadVar

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

ThreadVar

Описание

ThreadVar
Declarations;

Ключевое слово ThreadVar начинает определение набора переменных, которые используются потоками.

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

Пример кода

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

// Наконец, убераемся, закрывая потоки
CloseHandle(thread1);
CloseHandle(thread2);
end;

end.

Три диалога отобразят:

Thread 1 Hello World
Thread 2 Goodbye World
Нажмите это, когда другие диалоги закончились.

Примечание

 

 

Авторизация



Счетчики