放掉所有分,求此答案------多线程临界区

chinaandys 2004-11-21 04:36:13
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;
...全文
146 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
getit911 2004-11-22
  • 打赏
  • 举报
回复
sleep会放出CPU给其他线程运行
chinaandys 2004-11-21
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);//执行线程
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挂起了
beyondtkl 2004-11-21
  • 打赏
  • 举报
回复
但就我所知,sleep API会令总个进程挂起,而不是让使用它的线程挂起。

// 不是令整个进程挂起的 只是使自己暂时睡眠5ms 不是5秒!是 5ms...表示自己在这5MS中 不去睁抢CPU。。。。

sleep(5); //这一句是否每循环一次就睡眠五秒,并且不执行下一个线程
// 是 5MS 5毫秒 不是不执行下一个线程 而是不执行下一次循环。。。是本线程的执行代码挂起5MS。。
chinaandys 2004-11-21
  • 打赏
  • 举报
回复
for i:=1 to maxsize do
begin
inc(incnum);
TT[i]:=incnum;
sleep(5); //这一句是否每循环一次就睡眠五秒,并且不执行下一个线程
end;
VeryOldMan 2004-11-21
  • 打赏
  • 举报
回复
我在实际应用中真没用过多线程,仅在一些练习中写着玩。


但就我所知,sleep API会令总个进程挂起,而不是让使用它的线程挂起。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧