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
Нажмите это, когда другие диалоги завершатся.
 



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