现有一个计算类,类中最主要的是一个计算函数fun(),还有大量的数据成员。实际运行时,该类会有多个实例对象需要执行计算工作。考虑设计多线程同步并发执行。
现在的情况是,该计算函数fun()对于任一实例对象来说,都需要周期反复执行的。现周期假设为T,即每T个周期执行一次。同时又要求,
如果在一定时间内计算函数fun()没有完成计算(比如T/2个周期内),当前周期的计算就无效,不继续进行计算,等待下个计算周期到来,再重新计算。大致构思的想法有如下,请大牛帮忙看看哪种比较好,或者有更好的也请不吝指教:
1、计算函数中计算量密集的关键循环代码处,每次循环条件判断都加上对超时事件的判断,如果等待到则释放事件,继续执行。同时外部线程设计定时器,在规定计算时间时候触发定时器,激活该事件。计算函数在下一个循环时候会无法获得该事件时,失败,则跳出计算循环,返回到等待下个计算周期的循环中;
2、外部线程每个周期都开启新计算线程,当限时到达时,判断该计算线程是否还alive,如果是,则强行TerminateThread掉计算线程(可能会比较危险);
3、外部线程每个周期都开启新计算线程,当限时到达时,发送消息给计算线程,计算线程收到消息时,自己退出自己(因为fun()函数是一个复杂计算函数,消息是否会被阻塞,无法响应);
4、计算线程内部设置定时器,计算时间到达时触发定时器,终结自己(担心同上,复杂计算时,定时器消息是否会被阻塞)

解决方案 »

  1.   

    我的建议是采用第二种方案,不过要改写你的 fun 函数,使得它能够被 Terminate 掉而不会出现意外;或者对它进行 suspend,再用一个函数来收拾它即可。
      

  2.   

    建议1和2结合起来用。
    1的问题是每个循环都检测,CPU耗时肯定太大。
    2的问题是新建线程浪费资源。
    所以最好是每个线程设定个完成标志,完成任务则标志为真,并等待新任务。外部线程则每到时间就进行检测,如果线程任务未完成,则强行终止,新建线程。任务已完成则分配新任务。
      

  3.   

    现在,经过一段时间的思考,觉得每个周期新建线程,没有必要,浪费时间浪费资源。
    设计出个以下的伪码设计是否可行:线程函数Fun()
    {
      while(WaitForSingleObject(线程终止事件,0) == WAIT_TIMEOUT)
      {
         if(WaitForSingleObject(新周期到来事件,INFINITE) == WAIT_OBJECT_0)
         {
            开始计算,做每个周期需要做的初始化工作,对局部变量的一系列赋值 while(复杂计算循环条件 == TRUE && WaitForSingleObject(超时事件,0) == WAIT_TIMEOUT)
            {
                继续复杂计算循环
                ...
            }
         }
      }
    }这样,该计算线程会自动响应新周期事件或者超时事件,根据这些事件控制自己的运行流程。
    这样做需要特别注意的地方,我感觉是局部变量的值,要保证不乱套,避免新周期用的局部
    变量是上个周期的值这种现象发生。不知道我考虑的是否周全、合理,请大家帮忙看看,提提建议,加分等着结贴了~~
      

  4.   

    其实我看到比较多的是线程自己内部加一个定时器.但是这个对你的好像不大实用。因为这个消息都是post的,如果计算周期内没完成,是无法处理定时器消息的。
    所以只能让外部线程做一个定时器,时间到了给计算线程post消息,让其退出。如果其没有退出(也就是计算没有完成),只有强制结束了。关于lz的方案,觉得保存复杂计算循环的临时环境有点困难的。只是不知道复杂计算循环到底是啥。          继续复杂计算循环 
                ..
      

  5.   

    外部定时器post给计算线程的消息也会被阻塞,所以我感觉只能在计算集中的部分“主动”地插入判断是否超时的措施。比如说对超时事件做判断或者对某个
    标志位做判断。现在主要担心是,因为要求计算快,肯定不能每个周期开新线程,只能是在一个线程内做。还有可能使用内核对象来做同步也会耗时,是不是用标志位的方式会快一些。大家帮忙给意见哈,散分了