在两个线程同时执行时,强制停止,然后再开始,偶尔会出现一个线程停止的情况,这是什么原因呢 ( 积分: 30 )

  • 主题发起人 主题发起人 seeok
  • 开始时间 开始时间
S

seeok

Unregistered / Unconfirmed
GUEST, unregistred user!
在两个线程同时执行时,点个按钮强制停止,即把两个线程Free掉,然后再点开始按钮时,再Create两个线程,但有时偶尔会出现一个线程不执行的情况,不知道这是什么原因引起的呢?两个线程的写法如下(只给出一个,两个类似):
procedure TDothread.Execute;
var
iLast : Cardinal;
iNow : Cardinal;
begin
iLast := GetTickCount;
while not Terminateddo
begin
Sleep(10);
iNow := GetTickCount;
if (iNow-iLast)>=iInterval*1000 then
begin
FrmMain.DoIt;
iLast := iNow;
end;
end;
end;
 
在两个线程同时执行时,点个按钮强制停止,即把两个线程Free掉,然后再点开始按钮时,再Create两个线程,但有时偶尔会出现一个线程不执行的情况,不知道这是什么原因引起的呢?两个线程的写法如下(只给出一个,两个类似):
procedure TDothread.Execute;
var
iLast : Cardinal;
iNow : Cardinal;
begin
iLast := GetTickCount;
while not Terminateddo
begin
Sleep(10);
iNow := GetTickCount;
if (iNow-iLast)>=iInterval*1000 then
begin
FrmMain.DoIt;
iLast := iNow;
end;
end;
end;
 
怎么没人回答啊?
 
procedure TDothread.Execute;
var
iLast : Cardinal;
iNow : Cardinal;
begin
iLast := GetTickCount;
while not Terminateddo
begin
Sleep(10);
iNow := GetTickCount;
if (iNow-iLast)>=iInterval*1000 then
begin
FrmMain.DoIt;:我不知道你这个是执行什么了?
iLast := iNow;
end;
end;
end;
 
DoIt执行的是与界面无关的数据处理的一个过程.
 
其实你这段代码是一个在相同时间间隔做某一工作,对于这个,我建议你使用
waitforsignalboject或者使用waitformultpleobjects来做,因为你退出线程的
时候可能出现一种情况,那就是等待的问题,等待这个时间点到达,然后执行,
可是有时候偏偏出现软件退出了,线程还在等待,所以建议你使用上面的事件来做
 
后退
顶部