有谁知道这个奇怪的问题,关于多线程的 sleep(xx) 的用法?(100分)

  • 主题发起人 主题发起人 pogoo
  • 开始时间 开始时间
P

pogoo

Unregistered / Unconfirmed
GUEST, unregistred user!
我开了4个线程,同时向一个SMTP服务器发送信件!大致的代码如下:
procedure TMainForm.Button1Click(Sender: TObject);
begin
for i := 0 to 3do
begin
OnlineThread:= TOnlineThread.Create(SmtpServerStr);

OnlineThread.FreeOnTerminate := True;
OnlineThread.OnTerminate := ThreadsDone;
if Abort then
Exit;
OnlineThread.Resume;
end;
end;
procedure MyThread.Execute;
var
iCount : integer;
begin
while not EoF(mytext)do
begin
......
inc(iCount);

end;
end;
procedure TMainForm.ThreadsDone(Sender: TObject);
begin
inc(ThreadsTerminateCount);
if ThreadsTerminateCount = 4 then
begin
ThreadsTerminateCount := 0;
CloseFile(mytext);
ShowMessage('All threads Complete!');
end;
end;
问题是:我在Execute中对每个线程的iCount分别计数,然后分别显示到4个Panel上,但是
怪事来了!我如果不在程序中加上sleep(xx),则计数只在一个panel上显示,别的线程就
好象并没运行。但如果加上sleep(xx),则必须要根据线程数来调整xx的值,并且与放置的
位置有关系,这样才能在4个panel上分别显示iCount值。如果放置的位置不对,或xx设置的
部队,则有时在1个panel上显示、有时在2个panel上显示、有时在3个panel上显示。这到底
是怎么回事,我都快给整疯了!!!!大富翁们!救救俺吧!!!!!!!!!!!!
 
出问题可能的地方太多了,请你把代码贴全好吗?
 
我还是没有听懂你的意思,能说详细点吗?[:(]
 
不好意思,太着急了,没说清楚!!!
其实,中心意思就是:在多线程的编程中,sleep(xx)是干什么用的?怎么用的?为什么要
用它?xx一般设为多少比较好?
 
sleep();一般不怎么用,很多时候只是为了演示效果,
但是sleepex()经常用,那是在重叠I/O里使事件句柄
进入可等待状态,以便启动回调函数。
 
但据说 Sleep(XX)是肯定需要的,否则系统没有空闲的cpu来做显示的工作,我在程序中没有
用Sleep(XX),结果4个线程不能正常工作,加上Sleep(XX)后,情况好多了!但需要调整XX的
值,我现在就是不知道如何调整这个XX的值!
 
TO pogoo
用不用sleep()是看你的具体需要。最好不用SLEEP(),
《windows多线程设计》上说用sleep()可能带来一些神秘的时间调整问题,
我是很少用SLEEP()的
 
to 张无忌
还是不太明白!但看来可能是我的程序出问题了!我要好好检查下。至于“可能带来一
些神秘的时间调整问题”,能否具体一些!谢了!!
 
<<windows多线程设计>>有电子书吗?如有的话,能给发一个吗?
 
<<windows多线程设计>>我看的是华中科技出版社出的”纸书“。
我详细看了一下,用sleep()后,系统将资源给了其他的线程,
这样线程运行就更加具有偶然性,,,我想这可能就是书上所说
的意思把...
 
你的线程create部分能看一下吗?
可能有问题
 
对你的问题,sleep(0)就足够了。其实只是把本线程的控制权交给系统,让系统再分配
罢了。至于显示不正确,不表明线程本身没有运行,只是panel上文字更新没有成功。
个人感觉线程里sleep掉,有点像是主线程的 Application.ProcessMessages :)
 
看样子你对多线程理解得不够。
再好好看看delphi带的例子。
 
是否在正常的多线程设计中,根本不需要sleep的?
 
一般是不需要的,你sleep()的时间,根本不精确,而且在线程中测试时间,定时等功能
是很难达到效果的。
 
sleep()是会挂起线程的,在你用sleep的地方线程全被挂起从而引起混乱,你可用API函数
WaitForSingleOBject来延时
 
sleep()是会挂起线程的
WaitForSingleOBject等待线程结束
 
多人接受答案了。
 
后退
顶部