Delphi справочник - Форум программистов - Навигация  
 A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z      По первой букве  
System     SysUtils     StrUtils     DateUtils     FileCtrl     ConvUtils     StdConvs     Math     Classes     Dialogs     Types     Variants    ПО Unit   Compiler directives     Directives     Keywords     Types     Variables     Constants     Functions     Procedures    По категории  
Подписаться на рассылку:
Клуб программистов


Основы Delphi
BeginThread
Функция
Начинает отдельный поток выполнения кода 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.
Похожие команды
EndThread  Заканчивает поток с кодом завершения

IsMultiThread  Возвращает True, если код выполняет множество потоков

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('Press this when other dialogs finished.', 200, 300);

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

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

Thread 1 Hello World
Thread 2 Goodbye Word
Нажмите это, когда другие диалоги завершатся.
 



© Блог программистов   |  Создание и продвижение сайтов - "Веб сателлит"  |  Ссылки  |     |  Английская версия