Разработка многопоточных приложений. Рудалев В.Г - 14 стр.

UptoLike

14
var
Form1: TForm1;
type
TMyThread = class(TThread)
private
{ Private declarations }
mem: TMemo;
// В переменную mem при вызове конструктора потока будет
// передаваться конкретный экземпляр TMemo
protected
constructor Create (M: TMemo);// Переопределение
procedure Execute; override;
procedure OutMessage;
end;
implementation
{$R *.DFM}
var CritSect: boolean; // Флаг «включать-не включать»
Sect1: TRTLCriticalSection;
//Критическая секция
GlobalData: integer; // Глобальная переменная
constructor TMyThread.Create(m: TMemo);
begin //Переопределяем конструктор
Inherited Create(False);//Вызываем унаследованный
Mem := m; // Передаем, куда записывать числа
end;
procedure TMyThread.OutMessage;
begin
// Добавление строки в редактор
Mem.Lines.add(IntToStr(GlobalData));
end;
procedure TMyThread.Execute;
var j: integer;
begin
for j:=1 to 50 do begin
// Если механизм критической секции используется
if (CritSect) then EnterCriticalSection(Sect1);
// Вход в критическую секцию
// Изменение глобальной переменной
GlobalData := GlobalData+3;
Sleep(3); // Задержка на 3 мс для увеличения
// вероятности рассинхронизации
GlobalData := GlobalData-3;
Synchronize(OutMessage);
// Выход из критической секции
if (CritSect) then LeaveCriticalSection(Sect1);
end;
end;
     var
       Form1: TForm1;

     type
       TMyThread = class(TThread)
       private
          { Private declarations }
          mem: TMemo;
        // В переменную mem при вызове конструктора потока будет
        // передаваться конкретный экземпляр TMemo
       protected
          constructor Create (M: TMemo);// Переопределение
          procedure Execute; override;
          procedure OutMessage;
       end;

     implementation

     {$R *.DFM}

     var CritSect: boolean; // Флаг «включать-не включать»
         Sect1: TRTLCriticalSection; //Критическая секция
         GlobalData: integer; // Глобальная переменная

     constructor TMyThread.Create(m: TMemo);
     begin                     //Переопределяем конструктор
       Inherited Create(False);//Вызываем унаследованный
       Mem := m;              // Передаем, куда записывать числа
     end;

     procedure TMyThread.OutMessage;
     begin // Добавление строки в редактор
       Mem.Lines.add(IntToStr(GlobalData));
     end;

     procedure TMyThread.Execute;
     var j: integer;
     begin
       for j:=1 to 50 do begin
         // Если механизм критической секции используется
         if (CritSect) then EnterCriticalSection(Sect1);
          // Вход в критическую секцию
         // Изменение глобальной переменной
         GlobalData := GlobalData+3;
         Sleep(3); // Задержка на 3 мс для увеличения
                 // вероятности рассинхронизации
         GlobalData := GlobalData-3;
         Synchronize(OutMessage);
         // Выход из критической секции
          if (CritSect) then LeaveCriticalSection(Sect1);
       end;
     end;


14