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

UptoLike

15
var Thread1, Thread2: TMyThread; //Экземпляры потоков
procedure TForm1.Button1Click(Sender: TObject);
begin
GlobalData := 100;
Memo1.Lines.Clear;
Memo2.Lines.Clear;
Thread1 := TMyThread.Create(Memo1);// Старт потока 1
Thread2 := TMyThread.Create(Memo2);// Старт потока 2
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
InitializeCriticalSection(Sect1);
CritSect := false;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteCriticalSection(Sect1);
end;
procedure TForm1.cbSectClick(Sender: TObject);
begin
CritSect := cbSect.Checked;
end;
end.
Очевидный, казалось бы, результат работы потоков (GlobalData=100) ис-
кажается коллизией «гонок» . Окно программы без использования синхронизации
имеет вид :
Использование критической секции решает проблему:
      var Thread1, Thread2: TMyThread; //Экземпляры потоков

      procedure TForm1.Button1Click(Sender: TObject);
      begin
        GlobalData := 100;
        Memo1.Lines.Clear;
        Memo2.Lines.Clear;
        Thread1 := TMyThread.Create(Memo1);// Старт потока 1
        Thread2 := TMyThread.Create(Memo2);// Старт потока 2
      end;

      procedure TForm1.FormCreate(Sender: TObject);
      begin
        InitializeCriticalSection(Sect1);
        CritSect := false;
      end;

      procedure TForm1.FormDestroy(Sender: TObject);
      begin
        DeleteCriticalSection(Sect1);
      end;

      procedure TForm1.cbSectClick(Sender: TObject);
      begin
        CritSect := cbSect.Checked;
      end;

      end.

       О чевидны й, казалось б ы , результат раб оты п отоков (GlobalData=100) ис-
каж ается коллизией « г онок». О кно п рог раммы б езисп ользования синхронизации
имеетвид:




      И сп ользованиекритичес
                            кой секцииреш аетп роб лему:

                                                                               15