线程的困惑---十万火急(200分)

  • 主题发起人 主题发起人 笑一刀
  • 开始时间 开始时间

笑一刀

Unregistered / Unconfirmed
GUEST, unregistred user!
语言为Delphi:
我在主线程中创建了一个线程:ThreadID1.我在这个线程中创建了一个对象Object1(这个对象创建过程中调用了动态连接库Dllx(在析构时释放掉)),然后调用了其一个成员函数fun1(对外接口),在这成员函数中我打开了一个文件(还在这个函数中关闭掉),并把文件的指针传到了动态连接库的函数fun2中。在fun2中我对这个文件进行操作。现在有问题如下:
问题:如果我在fun2中处理文件时出现了死循环(或者这个文件太大而处理时间过长),而我需要这个线程跳过死循环(这种情况应该不可能)或者安全的退出线程(我指的是线程要释放它所创建的所有资源:对象、动态连接库……),然后另外创建一个与上面同样功能的线程,我应该怎么办?
注:1、不用TeminateThread()API函数强制退出线程,因为这种方法不能释放所有资源。
2、提示:可以考虑一种类似Timer的方法,在线程内部创建两条并行的执行路线(line1,line2)。line1处理文件,line2统计line1的执行时间。当line1的执行时间大于一个事先设定的值时,line2就给线程发出通知,告知线程运行时间太长了,调用ExitThread()立即退出线程。(这方法我想了很久,一直没找到解决办法)
3、如果各位大侠有什么高招,请快快告知,谢了先。[:D]
 
另外开一个守护线程,监视其他线程的运行情况,通常服务程序中都是这样做的。
运行线程设立两个全局标志供守护线程读取。
1.任务开始时间
2.任务描述
守护线程也可以开设一个标志Flag初始为False
运行线程在长时间处理中间加上一条Flag判断,如果Flag=True那就强制退出线程并释放资源,
将flag重新置为false,守护线程根据Flag的一次变化再次开启运行线程。
 
我们假设fun2中绝对是一个死循环,并且fun2在进入死循环后立即马不停蹄地申请
内存资源(没这么夸张,那就假设它只申请了1K的内存吧),线程进入此循环就死
定了,怎么办呢?
1。TerminateThread强制中止线程,不能释放所有资源(起码不能释放fun2的那1K);
2。调用ExitThread:这是不可能的,线程都死了,你还想它执行退出?
3。线程的Terminate方法:没有用的,线程已经死了;
3。其它高招:我是无招胜有招,也就是没招了。
我的结论(仅供参考):没有办法,除非这个DLL是你写的,你可以改它,可以加入
检测代码,在超时情况下自己退出。
 
回Adnil:
你这个方法,我已经试过了,不能解决死循环问题。如果在每一个可能出现死循环的地方
都加一条判断语句,对于一个代码很长的函数会很麻烦的。并且看护线程不能安全释放运行线程。
回Huzzz:
你提供的方法是一个好的思路,值得一想。但是我们在动态链接库中可以得到函数fun2
被外界调用的时间吗?还有我应该怎样监视函数fun2的运行呢?
谢谢二位大侠!!!![:)]
 
>在动态链接库中可以得到函数fun2被外界调用的时间吗?
当然可以(如果DLL是你自己写的),FUN2应该自己监视自己运行的时间。
 
后退
顶部