多线程的疑问。。。

caima123 2016-12-30 10:15:54
我的程序中开了三个线程,分别定期执行不同的工作,比如间隔多少分钟运行一次,三个线程内都是无限循环,用sleep来实现运行间隔。。。




myThread01 := TThread.CreateAnonymousThread(
procedure

begin
Terminated := true;
while Terminated do
begin
makearticle; // 生成文章事务
checkexe;
// Sleep(600000); // 沉睡10分钟
Sleep(100000);

end;

end);
myThread01.Start;



现在的问题是,比如sleep 设定为睡眠10分钟,但有时候10分钟后并不执行,甚至等了1个小时都不执行。。。

有些时候是正常的。

像我这种需求,应该如何解决呢?有没有更好的实现方法呢??

...全文
1038 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr Dang 2017-03-13
  • 打赏
  • 举报
回复
主要问题在于延时函数不能用sleep,用GetTickCount较精准,再写个日志看看线程是否一直是存活,不存活检查你的线程代码。
lyhoo163 2017-03-13
  • 打赏
  • 举报
回复
简单的语句中楒使用sleep.,但是在线程中,不能使用。他会死掉的。
polly_110 2017-03-10
  • 打赏
  • 举报
回复
我的做法跟四楼一样的。
zhujinqiang 2017-01-12
  • 打赏
  • 举报
回复
用一个TTimer,定时启动线程。
lyhoo163 2017-01-05
  • 打赏
  • 举报
回复
还是TTimer与线程结合起来比较好,TTimer开关,线程执行。
cohye 2017-01-05
  • 打赏
  • 举报
回复

while Terminated do
      begin
        try
          makearticle; // 生成文章事务
          checkexe;
        except
          showmessage('something went wrong');
        end;
        Sleep(100000);
 
      end;
Mit1208 2017-01-02
  • 打赏
  • 举报
回复
线程里无限循环使用While Not Terminate Do 可以使用#4楼的方法检测时间。
santiaodahan 2016-12-31
  • 打赏
  • 举报
回复
输出调试信息方法:在项目文件中添加 {$APPTYPE CONSOLE} 可以生成一个控制台窗口。在需要输出调试的地方添加writeln(your info);语句就可以在控制台窗口中输出调试信息了。或使用OutputDebugString()函数输出调试信息,在Event Log窗口中查看。楼主的代码能编译通过?
不得闲 2016-12-30
  • 打赏
  • 举报
回复

我一般用这样用
dt := GetTickcount;
while true do
begin
   if gettickcount - dt >= 1000*60 then
   begin
       doSomething();
       dt := gettickcount;
   end;
   if waitforsingleobject(qutevent,2) = Wait_object_0 then
       break;
end;
Frank6600 2016-12-30
  • 打赏
  • 举报
回复
解决这个问题的关键点是:让运行过程透明。 据我所知,Delphi不像其他的语言工具一样提供Console, 可以用一个简单的指令(比如println(Str))在运行时把String打印到Console以达到监看运行过程的效果(就是我说的“让运行过程透明”), 你得自己想个办法把这个信息传递出来,才能知道为什么它不照你想的做。 想什么办法呢? 一般我会用一个TStringList,每次add一个str时,就saveToFile(d:\test.txt) 你可以试试。 例如: myThread01 := TThread.CreateAnonymousThread( procedure Strings: TStringList; begin Strings:=TStringList.create; Terminated := true; while Terminated do begin Strings.add('1'); Strings.saveToFile('b:\test.txt'); makearticle; // 生成文章事务 Strings.add('2'); Strings.saveToFile('b:\test.txt'); checkexe; Strings.add('3'); Strings.saveToFile('b:\test.txt'); // Sleep(600000); // 沉睡10分钟 Sleep(100000); Strings.add('4'); Strings.saveToFile('b:\test.txt'); end; Strings.add('9'); Strings.saveToFile('b:\test.txt'); end); myThread01.Start; 会不会觉得这个方法有点笨?你可以自己想其他更好的方法。
看那山瞧那水 2016-12-30
  • 打赏
  • 举报
回复
Terminated := true; while Terminated do Terminated := true,发出命令,让线性结束,但不是马上结束(Excute完结束),所以你这个线程第一次执行完就挂了。 一般无限循环: while not Terminated do Terminated := true;这个一般用于外部调用,主线程要结束某个子线程,myThread01.Terminated := true
m0_37134590 2016-12-30
  • 打赏
  • 举报
回复
可能makearticle和checkexe会出什么错误致使线程终止 while Terminated do begin try makearticle; // 生成文章事务 checkexe; except showmessage('something went wrong'); end; Sleep(100000); end;
lyhoo163 2016-12-30
  • 打赏
  • 举报
回复
sleep 语句,可以用在短暂的等待。长时等待不宜使用它的。因为它的运行受到干扰。 建议你使用一个TTimer,定时启动线程。同时线程,要有自动结束的功能。
kevin_wzh 2016-12-30
  • 打赏
  • 举报
回复
这个是答案
引用 2 楼 jankercsdn 的回复:
Terminated := true; while Terminated do Terminated := true,发出命令,让线性结束,但不是马上结束(Excute完结束),所以你这个线程第一次执行完就挂了。 一般无限循环: while not Terminated do Terminated := true;这个一般用于外部调用,主线程要结束某个子线程,myThread01.Terminated := true

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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