Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Использование потоков



Использование потоков имеет смысл для организации приложения, в котором можно производить одновременно вычисления и какую-то другую полезную работу, например, работать с результатами предыдущих вычислений. Допустим, имеется основная форма для работы с результатами Form1 и немодальная форма Form2, которая вызывается из основной формы и содержит поля ввода параметров и статистики, кнопки СТАРТ и СТОП. При нажатии кнопки СТАРТ осуществляется проверка введенных пользователем данных и запускается расчет, для чего создается новый поток. В этом потоке производятся все вычисления и проверяется нажатие кнопки СТОП, чтобы прервать расчет до его завершения. При такой организации вычислений в момент расчета у пользователя есть возможность работать с Form1, просматривая и анализируя результаты предыдущих вычислений. Пошаговый алгоритм реализации расчетов с использованием потока может выглядеть так.

1. На главной форме приложения Form1 (Unit1) размещаем главное меню, одной из функций которого будет вызов формы Form2 (Unit2) для заполнения полей ввода и запуска расчета, и компоненты, предназначенные для когнитивной визуализации результатов расчетов: поля, сетки, графики.

2. Добавляем в проект новую форму Form2, размещаем поля для ввода данных, кнопки СТАРТ и СТОП.

3. File -> New -> Other -> вкладка New -> Thread object. В проект будет добавлен новый файл (назовем его Unit3.pas). В этом модуле Delphi сформирует заготовку для потока: класс потока (назовем его TThread) и Execute – основной метод класса TThread. В метод Execute помещаем код, реализующий расчетный блок с использованием метода Монте-Карло.

4. В обработчике события OnClick кнопки СТАРТ модуля формы Form2 размещаем программный код для считывания введенных данных, их валидацию и запуск расчета, если данные корректны. При запуске расчета создаем новый поток. Булевская переменная в конструкторе указывает на то, как создавать поток – приостановленным или запускать сразу.

//в разделе глобальных переменных объявляем

//переменную-экземпляр класса потока

Var th: TThread;

//после нажатия СТАРТ и успешной валидации

th:= TThread.Create(false);//создаем приостановленный поток

th.FreeOnTerminate:= true; // деструктор потока вызывается

// автоматически по завершении потока

th.Priority:= tpLower; //низкий приоритет для потка

th.Resume;//явный запуск потока

Поток останавливается по окончании расчета или принудительно при нажатии пользователем кнопки СТОП (флаг FlagStop получает значение true). Отличительной чертой специального класса Tthread, предоставляемого Delphi для реализации потоков, является гарантия безопасной работы с библиотекой визуальных компонентов VCL. Delphi предоставляет программисту метод Synchronize для безопасного вызова методов VCL внутри потоков. Во избежание конфликтных ситуаций, метод Synchronize дает гарантию, что к каждому объекту VCL одновременно имеет доступ только один поток. Допустим, мы создали поток вычислений и хотим в нем в конце каждой сотой итерации цикла выводить статус выполнения расчета в ProgressBar, расположенный на форме Form2. Значения начальной и максимальной позиции ProgressBar заданы до запуска расчетного блока в потоке.

Procedure TThread.Execute;

Begin

...

While(i < Size) //Основной цикл внутри потока

Begin

...

If i mod 100 = 0 then

Synchronize(Form2.ShowStatus);

...

End;

Procedure TForm2.ShowStatus;

Begin

Application.ProcessMessages;

ProgressBar1.Position:=ProgressBar1.Position + 100;

if FlagStop = true then

begin

Stat:= i+1;

th.Terminate;

End;

End;

И последний штрих: в интерфейсной части модуля формы Form2 нужно добавить ссылку на модуль Unit3, содержащий описание и методы класса потока, а в исполнимой части модуля Unit3 потока добавить оператор Uses Unit2; Этот оператор нужен, поскольку метод синхронизации принадлежит модулю Unit2, а в модуле потока есть на него ссылка.





Дата публикования: 2014-11-03; Прочитано: 391 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с)...