Пример создания многопоточного приложения в Delphi

Этот раздел содержит описание шагов, необходимых для создания простого, но показательного примера многопоточного приложения. Мы будем пытаться вычислить число "пи" с максимальной точностью после запятой. Конечно, встроенная в Delphi константа pi имеет достаточную точность, правильнее сказать - максимальную, допускаемую самым точным 10-байтным форматом для вещественных чисел Extended. Так что превзойти ее нам не удастся. Но этот пример использования потоков может послужить прологом для решения реальных задач.

Первый пример будет содержать два потока: главный (обрабатывающий ввод пользователя) и вычислительный; мы сможем изменять их свойства и наблюдать за реакцией.

Итак, выполните следующую последовательность действий:

1. В среде Delphi откройте меню File и выберите пункт New Application.

2. Расположите на форме пять меток и один переключатель, как показано на рис. 29.2.

Переименуйте главную форму в fmMain.

3. Откройте меню File и выберите пункт Save Project As. Сохраните модуль KaKuMain, а проект - как Threads 1.

Программирование в Delphi 7

Рис. 29.2. Внешний вид формы для приложения Threads!

4. Откройте меню File и выберите пункт New. Затем дважды щелкните на объекте типа поток (значок Thread Object). Откроется диалоговое окно New Items, показанное на рис. 29.3.

Программирование в Delphi 7
Рис. 29.3. Диалоговое окно New Items с выбранным объектом типа "поток"
Программирование в Delphi 7

PMC.29.4.flnanoroBoeoKHoNewThreadObject

5. Когда появится диалоговое окно для именования объекта поток, введите TPiThread и нажмите клавишу <Enter> (рис. 29.4). Помимо этого, при желании, вы можете присвоить создаваемому потоку имя, установив флажок Named Thread и задав имя в поле Thread Name. Так как имя потока используется только для удобства обозначения, эту возможность мы использовать не будем.

Delphi создаст новый модуль и поместит в него шаблон для нового потока.

6. Код, вносимый в метод Execute, вычисляет число л, используя сходимость бесконечного ряда Лейбница:

к = 4 _ 4/3 + 4/5 _ 4/7 + 4/9 -...

Разумеется, отображать новое значение после каждой итерации - это то же самое, что стрелять из пушки по воробьям. На отображение информации система потратит в десятки раз больше времени, чем на собственно вычисления. Поэтому мы ввели константу updatePeriod, которая регулирует периодичность отображения текущего значения.

Код метода Execute показан ниже:

const

// Лучше использовать нечетное число для того, чтобы избежать эффекта // мерцания

UpdatePeriod = 1000001;
procedure TPiThread.Execute;
var sign : Integer;
PiValue, PrevValue : Extended;
i : Int64;
begin
{ Place thread code here } PiValue := 4;
sign : = - 1 ;
i := 0;
repeat Inc(i) ;
PrevValue := PiValue;
PiValue := PiValue + sign * 4 / (2*i+l);
sign := -sign;
if i mod UpdatePeriod = 0 then begin GlobalPi := PiValue;
GlobalCounter := i;
Synchronize(fmMain.UpdatePi);
end;
until Terminated or (Abs(PiValue - PrevValue)<1E-19);
end;

7. Откройте меню File и выберите пункт Save As. Сохраните модуль с потоком как uPiThread.pas.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Ноябрь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс