Мои Конспекты
Главная | Обратная связь

...

Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

Метод WaitFor





Помощь в ✍️ написании работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

OnTerminate, как обсуждалось в предыдущей части, полезно, если вы используете поток в режиме "выполнить и забыть", с автоматическим разрушением. Но что, если в некий момент выполнения главного потока VCL вы должны быть уверены, что все остальные потоки завершены? Решение состоит в использовании метода WaitFor, который пригодится в следующих случаях:

Главному потоку VCL нужен доступ к объекту рабочего потока после его остановки для чтения или записи содержащихся в нем данных .

Принудительное завершение потоков при закрытии программы неприемлемо.

Попросту говоря, когда поток А вызывает метод WaitFor потока B, сам он приостановливается, пока поток B не завершится. И когда поток А продолжит свое выполнение, можно быть уверенным, что результаты из потока B можно прочесть, и что объект потока B можно уничтожать. Обычно при завершении программы основной поток VCL вызывает Terminate всех вторичных потоков, и затем ожидает их завершения (WaitFor), после чего осуществляется выход из программы.

Контролируемое завершение потока - Подход 2

В этом примере мы модифицируем код программы для простых чисел так, чтобы в каждый момент выполнялся только один поток, и программа перед выходом будет ждать завершения потока. Хотя в этой программе и не обязательно основному потоку ждать завершения других, но упражнение будет полезным и продемонстрирует несколько свойств WaitFor, которые не всегда желательны, а также проиллюстрирует пару довольно тонких моментов, которые могут быть упущены новичками в программировании потоков. Сначала код главной формы

unitPrimeForm;

 

Interface

Uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, PrimeThread;

Const

WM_THREAD_COMPLETE = WM_APP + 5437; { Just a magic number }

Type

TPrimeFrm = class(TForm)

NumEdit: TEdit;

SpawnButton: TButton;

ResultsMemo: TMemo;

procedureSpawnButtonClick(Sender: TObject);

procedureFormCloseQuery(Sender: TObject; varCanClose: Boolean);

Private

FThread: TPrimeThrd;

procedureHandleThreadCompletion(var Message: TMessage);

messageWM_THREAD_COMPLETE;

end;

Var

PrimeFrm: TPrimeFrm;

Implementation

 

{$R *.DFM}

procedureTPrimeFrm.HandleThreadCompletion(var Message: TMessage);

Begin

IfAssigned(FThread) then

Begin

FThread.WaitFor;

FThread.Free;

FThread := nil;

end;

end;

 

procedureTPrimeFrm.SpawnButtonClick(Sender: TObject);

Begin

If notAssigned(FThread) then

Begin

FThread := TPrimeThrd.Create(True);

FThread.FreeOnTerminate := false;

Try

Доверь свою работу ✍️ кандидату наук!
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой



Поиск по сайту:







©2015-2020 mykonspekts.ru Все права принадлежат авторам размещенных материалов.