На этом шаге будут рассмотрены основные действия для создания потока.
Теперь в среде Delphi попробуем создать приложение, использующее поток. Так как на данном этапе нам важно рассмотреть основные действия для создания простейшего потока, мы наделим наш поток минимальной функциональностью. Описанные на этом шаге действия по созданию потока применялись в среде Delphi 6.
Пусть у нас имеется приложение с формой (рис. 1) и имеющейся на ней кнопкой (TButton).
Рис.1. Вид формы приложения
Наша задача в том, чтобы создать поток, который будет запускаться при нажатии кнопки и изменять у формы свойство Caption. Для начала откроем меню File и выберем пункт New и в раскрывшемся меню выберем пункт Other.... В появившемся диалоговом окне New Items (рис 2) на вкладке New находим значок Thread Object и делаем на нем двойной щелчок.
Рис.2. Диалоговое окно New Items
Далее в диалоговом окне New Thread Object (рис. 3) вводим имя класса, который будет являться потомком класса TThread и описывать наш поток. Здесь нужно учитывать, что к имени класса не будет автоматически добавлена буква "Т", поэтому желательно подставлять ее самостоятельно. Назовем класс нашего потока, например, TMyThread. Теперь можем нажать кнопку OK.
Рис.3. Диалоговое окно New Thread Object
После нажатия кнопки OK в проекте нашего приложения будет создан новый модуль, содержащий реализацию класса TMyThread.
unit Unit2; interface uses Classes; type TMyThread = class(TThread) private { Private declarations } protected procedure Execute; override; end; implementation { TMyThread } procedure TMyThread.Execute; begin { Place thread code here } end; end.
Мы видим, что уже изначально в заготовке для нового класса присутствует перегруженный метод Execute. В тело этого метода мы и будем помещать код, который будет выполнять наш поток.
Теперь заставим наш поток изменять у формы свойство Caption. Для этого нужно в методе Exеcute поместить вызов метода Synchronize (все обращения к методам и свойствам библиотеки VCL из потока должны выполняться через этот метод), параметром которого будет процедура, которая, в свою очередь, и изменяет свойство Caption.
Модуль потока будет выглядеть следующим образом.
unit Unit2; interface uses Classes; type TMyThread = class(TThread) private { Private declarations } protected procedure Execute; override; procedure UpdateCaption; end; implementation uses Unit1; { TMyThread } procedure TMyThread.UpdateCaption; begin Form1.Caption:='Приложение с потоком'; end; procedure TMyThread.Execute; begin { Place thread code here } Synchronize(UpdateCaption); end; end.
Нужно обратить внимание, что в секции implementation мы подключаем модуль Unit1, так как используем идентификатор Form1, описанный в этом модуле.
Теперь, чтобы использовать созданный нами класс потока в модуле Unit1, добавим модуль Unit2 к списку используемых модулей в секции interface. После этого в секции private класса формы опишем объект создаваемого потока.
Thread1: TMyThread;
Далее создаем обработчик нажатия кнопки Button1, в который поместим запуск потока.
procedure TForm1.Button1Click(Sender: TObject); begin //создаем поток Thread1:=TMyThread.Create(True); //освободить память по завершению Thread1.FreeOnTerminate:=True; //запускаем поток Thread1.Resume; end;
На самом деле поток можно было запустить проще, послав методу Create параметром значение False. Тогда не было бы необходимости вызывать метод Resume.
Текст этого примера можно взять здесь.
На следующем шаге речь пойдет о синхронизации потоков.