![]() |
|
|
#1
|
||||
|
||||
|
Всем добрый день! начал изучать работу с потоками... и сталкнулся с такой проблемой... (создаю например 5 потоков), что бы какую то часть кода выполнял только один поток, а все остальные ожидали окончания выполнения этого кода как я понял используется "TCriticalSection" и его методы Enter и Leave... написал вот такой код для процедуры Execute:
Код:
procedure TMyThread.Execute; var i:integer; cs:TCriticalSection; begin for i:=0 to 10000 do begin cs.Enter; s:='2*'+inttostr(i)+'='+inttostr(i*2); cs.Leave; Synchronize(show); end; end; выдаёт сообщение: "Debugger Exception Notification" в чём ошибка? помогите пожалуйста! ![]() |
|
#2
|
||||
|
||||
|
извени те пожалуйста... проблема решилась...
забыл написать: Код:
CS:=TCriticalSection.Create; и получается:Цитата:
как сделать так? Цитата:
помогите пожалуйста( |
|
#3
|
||||
|
||||
|
TCriticalSection должна быть глобальной:
Код:
unit Unit1;
interface
uses
SyncObjs,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls;
type
TMyThread = class(TThread)
private
procedure Avatar;
protected
procedure Execute; override;
public
i: Integer;
constructor Create;
end;
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
cs: TCriticalSection;
implementation
{$R *.dfm}
{ TMyThread }
procedure TMyThread.Avatar;
begin
Form1.Memo1.Lines.Add(IntToStr(i));
end;
constructor TMyThread.Create;
begin
inherited Create(True);
FreeOnTerminate:=True;
end;
procedure TMyThread.Execute;
begin
cs.Acquire;
try
Sleep(i);
finally
cs.Release;
end;
Synchronize(Avatar);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with TMyThread.Create do
begin
i:=2000;
Resume;
Sleep(100);
end;
with TMyThread.Create do
begin
i:=1000;
Resume;
Sleep(100);
end;
with TMyThread.Create do
begin
i:=500;
Resume;
Sleep(100);
end;
end;
initialization
cs:=TCriticalSection.Create;
finalization
cs.Free;
end. |
|
#4
|
||||
|
||||
|
Это понял... спасибо...
извеняюсь за колличество вопросов в одной теме... Код:
procedure TMyThread.Execute; var i2:integer; begin for i2:=1 to 10000 do begin cs.enter; S:=inttostr(i2); cs.leave; Synchronize(Avatar); end; end; или я делаю что не так.... или я туплю ![]() |
|
#5
|
||||
|
||||
|
дурак я... прошу прощения за за этот флуд...
разобрался: Код:
procedure TMyThread.Execute; var i2:integer; begin for i2:=1 to 10000 do begin cs.enter; S:=inttostr(i2); Synchronize(Avatar); end; cs.leave; end; тему можно закрывать) |