procedure TTest.execute;
var
i:integer;
begin
FreeOnTerminate:=true;
enterCriticalSection(CS);
for i:=1 to maxsize do
begin
inc(incnum);
TT[i]:=incnum;
sleep(5); //这一句是否每循环一次就睡眠五秒,并且不执行下一个线程
end;end;
procedure Tform1.T1done(sender:Tobject);
var
i:Integer;
begin
listbox1.Items.Clear;
for i:=1 to maxsize do
begin
listbox1.Items.Add(inttostr(TT[i]));
end;
leavecriticalsection(cs);
end;
procedure Tform1.T2done(sender:Tobject);
var
i:integer;
begin
listbox2.Items.Clear;
for i:=1 to maxsize do
listbox2.Items.Add(inttostr(TT[i]));
leavecriticalsection(cs);end;
procedure TForm1.Button1Click(Sender: TObject);//执行线程
begin
initializeCriticalSection(CS);
T1:=TTest.Create(false);
T1.OnTerminate:=T1done;
T2:=TTest.Create(false);
T2.OnTerminate:=T2done;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
deletecriticalsection(cs);
end;
var
i:integer;
begin
FreeOnTerminate:=true;
enterCriticalSection(CS);
for i:=1 to maxsize do
begin
inc(incnum);
TT[i]:=incnum;
sleep(5); //这一句是否每循环一次就睡眠五秒,并且不执行下一个线程
end;end;
procedure Tform1.T1done(sender:Tobject);
var
i:Integer;
begin
listbox1.Items.Clear;
for i:=1 to maxsize do
begin
listbox1.Items.Add(inttostr(TT[i]));
end;
leavecriticalsection(cs);
end;
procedure Tform1.T2done(sender:Tobject);
var
i:integer;
begin
listbox2.Items.Clear;
for i:=1 to maxsize do
listbox2.Items.Add(inttostr(TT[i]));
leavecriticalsection(cs);end;
procedure TForm1.Button1Click(Sender: TObject);//执行线程
begin
initializeCriticalSection(CS);
T1:=TTest.Create(false);
T1.OnTerminate:=T1done;
T2:=TTest.Create(false);
T2.OnTerminate:=T2done;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
deletecriticalsection(cs);
end;
但就我所知,sleep API会令总个进程挂起,而不是让使用它的线程挂起。
begin
inc(incnum);
TT[i]:=incnum;
sleep(5); //这一句是否每循环一次就睡眠五秒,并且不执行下一个线程
end;
// 是 5MS 5毫秒 不是不执行下一个线程 而是不执行下一次循环是本线程的执行代码挂起5MS。。
begin
initializeCriticalSection(CS);
T1:=TTest.Create(false);
T1.OnTerminate:=T1done;
T2:=TTest.Create(false);
T2.OnTerminate:=T2done;
end;
我这里有二个线程,并使用了临界区。T1的execute中执行了sleep挂起后,是否是挂起5MS后再执行
线程T2了.
而我这个sleep又在循环中,是否每次都执行sleep挂起了