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


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

Что это все значит для Delphi-программиста?



Это означает, что если не нужно проводить действия с VCL, а только обеспечить доступ к данным и их изменение, при написании программ с использование потоков на Delphi программист избавлен от бремени TThread.Synchronize.

· Потоку VCL не нужно находиться в состоянии ожидания, чтобы рабочий поток мог модифицировать общие ресурсы, он только не должен быть внутри критической секции.

· Критические секции не знают и не заботятся о том, является ли их владелец основным потоком VCL или экземпляром объекта TThread, так как только один из потоков может использовать критическую секцию.

· Программист, разрабатывающий многопоточное приложение, может теперь безопасно (почти) использовать WaitFor, избегая проблемы зацикливания.

В последнем пункте указано "почти", поскольку все-таки возможно вызвать зацикливание точно таким же способом, как и прежде. Все, что нужно для этого сделать - вызвать WaitFor в основном потоке, когда он находится в критической секции. Как мы увидим позже, остановка потока на большой промежуток времени, когда он внутри критической секций - плохая идея. Теперь, когда я более-менее объяснил теорию, представлю еще один пример. Это чуть более изящная и интересная программа нахождения простых чисел. Вначале она пытается найти простые числа, стартуя с числа 2, и продвигаясь по числовому ряду вверх. Каждый раз, определив, что число простое, она обновляет общую структуру данных (список строк) и сообщает основному потоку, что к списку добавлены новые данные. Вот код главной формы

unitPrimeForm2;

 

Interface

Uses

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

StdCtrls, PrimeThread;

Const

WM_DATA_IN_BUF = WM_APP + 1000;

MaxMemoLines = 20;

Type

TPrimeFrm = class(TForm)

ResultMemo: TMemo;

StartBtn: TButton;

StartNumEdit: TEdit;

StopBtn: TButton;

procedureStartBtnClick(Sender: TObject);

procedureStopBtnClick(Sender: TObject);

procedureFormClose(Sender: TObject; varAction: TCloseAction);

Private

{ Private declarations }

FStringSectInit: boolean;

FPrimeThread: TPrimeThrd2;

FStringBuf: TStringList;

procedureUpdateButtons;

procedureHandleNewData(var Message: TMessage);

messageWM_DATA_IN_BUF;

Public

{ Public declarations }

StringSection: TRTLCriticalSection;

propertyStringBuf: TStringList readFStringBuf writeFStringBuf;

end;

 

Var

PrimeFrm: TPrimeFrm;

 

Implementation

 

{$R *.DFM}

 

procedureTPrimeFrm.UpdateButtons;

Begin

StopBtn.Enabled := FStringSectInit;

StartBtn.Enabled := notFStringSectInit;

end;

 

procedureTPrimeFrm.StartBtnClick(Sender: TObject);

Begin