Работа с потоками в Delphi 7.

  • 06 окт. 2011 г.
  • 4461 Слова
Работа с потоками в Delphi 7.
Опубликовано в 2010 в рубриках: Разное
Метки: Delphi, Программирование


В статье, посвященной работе с COM портами в делфи у нас возникла проблема, решить которую поможет асинхронное чтение данных из порта. Но прежде чем разбираться с асинхронным чтением нужно научиться работать с потоками. Тем, кто знает как работать с потоками, данную статью можно нечитать, потому что в данной статье будет дан только самый минимум данных о работе с потоками, необходимый для понимания следующей статьи.

Теперь разберемся с тем, что же такое потоки. Все мы знаем что в Windows могут выполняться одновременно несколько процессов (программ), например мы можем слушать музыку, просматривать фотографии и сидеть в интернете одновременно. На самом деле в каждый конкретный моментвыполняется только одна программа (если процессоров в компьютере больше чем один, то соответственно одновременно может выполняться больше программ). Программам выделяются так называемые кванты времени – это отрезки времени в течении которых программа выполняется, по истечении кванта, на процессоре начинает выполняться другая программа, потом следующая и так по кругу. Кванты времени на столькомалы, что мы не замечаем этого и нам кажется, что все программы работают одновременно. Вообще, если рассматривать вопрос более подробно, то кванты выделяются не процессам, а потокам. Каждый процесс содержит как минимум один поток, но можно сделать и больше. Таким образом можно добиться того, что бы одна программа выполняла 2 задачи как бы одновременно (а на многопроцессорных компьютерах и одновременно),например один поток обрабатывает нажатия кнопок на форме, ввод данных в различные поля, а второй ожидает поступления данных в COM порт. При этом не будет происходить зависания окна программы. Как работать с COM портом в отдельном потоке, я расскажу в следующей статье, а в этой очень кратко рассмотрю работу с потоками на более простом примере. Поместим на форму в Delphi кнопку и компонент ProgressBarс вкладки Win32:

Форма программы с кнопкой и ProgressBar’ом

В обработчике нажатия на кнопку напишем такой код:

procedure TForm1.Button1Click(Sender: TObject);
var
i:byte;
begin
for i:=1 to 100 do begin
sleep(100);
progressbar1.Position:=i;
end;
end;
В цикле просто увеличиваем счетчик на единичку и заполняем ProgressBar, sleep вставлен для того, что бы заполнение непроисходило мгновенно. Теперь запускаем программу, нажимаем кнопку поехали, прогрессбар начинает постепенно заполняться, если в это время попробовать передвинуть окно программы или закрыть его, то ничего не выйдет, до тех пор пока не заполнится весь прогрессбар, то есть до окончания работы цикла. Если же цикл выполнять в отдельном потоке, то такого зависания не произойдет.

Теперь рассмотрим, какже работать с этими самыми потоками. В Windows есть специальные функции для работы с потоками, но разработчики Delphi позаботились о нас и создали специальный класс TThread, предназначенный для работы с потоками, работать с которым должно быть легче, чем с WinApi. Что бы добавить поток в программу жмем File->New->Other…. В появившемся окне:

Выбираем TreadObject и жамкаем OK, обзываем его какнибудь (поле ClassName), я назвал TProgressThread. В результате всех этих действий появляется новый модуль с таки исходным текстом:

private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TProgressThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }

{ TProgressThread }
procedure TProgressThread.Execute;
begin
{ Place thread code here }
end;
end.
Все что будет выполняться в методе Execute, будет выполняться как раз в новом потоке. Важное...
tracking img