![]() |
|
#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; ![]() ![]() |