Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2012, 21:11   #1
bugiman
Новичок
Джуниор
 
Регистрация: 06.06.2012
Сообщений: 1
По умолчанию Delphi Mutex Semaphore CS

Здравствуйте,есть программа.В ней 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.
bugiman вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не проверять Mutex если программа запущена с параметром Человек_Борща Общие вопросы Delphi 10 09.05.2011 20:34
Блокировки mutex в Linux papos Помощь студентам 0 25.04.2011 00:44
Использование mutex Sparky Помощь студентам 1 29.05.2010 16:24
Не работает Mutex (MDI приложение) Terazoid Win Api 1 26.04.2010 16:53