Здравствуйте,есть программа.В ней 3 потока генерируют рандомные числа до 20,и записывают в массив(вывод в мемо)синхронизация потоков реализуется с помощью критической секции(CriticalSection),помогите переделать программу так чтобы 1 поток способ Mutex,2 - semaphore,а 3 пусть так и останется CS.Сообственно нужна помощь в переделки 2 потоков...Очень нужна))На форме 2 кнопки запуск и вывод в массив,Мемо(куда выводит)и 3 потока(label).Исходник ниже...
UNIT1
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,unit2, XPMan;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
critical:TRTLCriticalSection;
th1:name1;
th2:name2;
th3:name3;
mas : Array [1..20] of Integer;
// count:integer;
{ Public declarations }
end;
var
count:integer;
Form1: TForm1;
Hadle1:Thandle;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
InitializeCriticalSection(critical);
count:=1;
th1:=name1.create(false);
th2:=name2.create(false);
th3:=name3.create(false);
end;
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
Memo1.Clear;
//Memo1.Lines[1]:=IntToStr(count);
for i:=1 to 20 do
begin
memo1.Lines.Add(IntToStr(i)+') '+IntToStr(mas[i]));
// Memo1.Lines[i]:=);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteCriticalSection(critical);
end;
end.
UNIT2
Код:
unit Unit2;
interface
uses
Classes,windows, Messages, SysUtils, Variants, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
name1 = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
type
name2 = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
type
name3 = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
uses unit1;
procedure name1.Execute;
begin
randomize;
while count<=20 do
begin
EnterCriticalSection(form1.critical);
form1.Label1.caption:='работает';
sleep(100);
form1.mas[count]:=random(100);
count:=count+1;
form1.Label1.caption:='ждет';
LeaveCriticalSection(form1.critical);
end;
end;
procedure name2.Execute;
begin
randomize;
while count<=20 do
begin
EnterCriticalSection(form1.critical);
form1.Label2.caption:='работает';
sleep(100);
form1.mas[count]:=random(100);
count:=count+1;
form1.Label2.caption:='ждет';
LeaveCriticalSection(form1.critical);
end;
end;
procedure name3.Execute;
begin
randomize;
while count<=20 do
begin
EnterCriticalSection(form1.critical);
form1.Label3.caption:='работает';
sleep(100);
form1.mas[count]:=random(100);
count:=count+1;
form1.Label3.caption:=' ждет';
LeaveCriticalSection(form1.critical);
end;
end;
end.