情景是这个样子的,
我有一个程序,要不停的(每隔5秒)写数据库,现在也不知道什么原因,在写数据库这步有可能会阻塞,我想把写数据库这步放入一个线程去执行,然后用waitforsingleobject的办法来放一个timeout, 大致结构是:
hEventDB = CreateEvent(...);
hHandle = CreateThread(threadfunc, ....)
ret = waitforsingleobject(hEventDB, 5*1000); //等待5秒
switch(ret)
{
casse WAIT_OBJECT_0:
      break;
case  WAIT_OBJECT_TIMEOUT:
      goto error_handler;
};void threadfunc(void)
{
    doDatabaseExec();
    SetEvent(hEventDB);
}不知道这样的思路是否可行,因为要频繁的开线程,有点担心,而且这是一个监控程序,可靠性要求很高

解决方案 »

  1.   

    其实楼主的代码并不是每5秒运行一次,因为doDatabaseExec执行也是需要时间的。另外,楼主担心的频繁操作线程问题,应该没问题。
      

  2.   

    要不停的(每隔5秒)写数据库
    没有5秒的间隔啊???
    hEventDB = CreateEvent(...); 
    hHandle = CreateThread(threadfunc, ....) 
    ret = waitforsingleobject(hEventDB, 5*1000); //等待5秒 
    switch(ret) 

    casse WAIT_OBJECT_0: 
          break; 
    case  WAIT_OBJECT_TIMEOUT: 
          goto error_handler; 
    }; 
    上面这段代码放在定时器里面吗?
      

  3.   

    1、线程是可以直接waitforsingleobject
    2、CreateThread建议换成_beginthreadex
    3、lz如果觉得频繁开新线程有问题(如果机器环境没什么压力,又5秒才执行一次,我觉得没什么问题,5秒,其实是一个很长的时间了),可以考虑这个线程一直运行,利用线程同步来处理。
    另外没看明白,lz是要数据库执行完以后等5秒,还是等数据库操作执行5秒?如果执行超过5秒,怎么办?这些可能会小小影响程序结构。
      

  4.   

    首先5秒不是一个要求那么精确(我甚至可以是1分钟),我加这段代码的目的是为了防止在万一的情况下,如果写数据库阻塞了,我要自己能反应过来,有一个处理机制。
    另外有一位朋友microyzy给我的提示很好,就是一个线程来干这个事情, 但是我不是很理解什么是线程同步, 是不是就是两个EVENT,主线程等A,辅线程等B,类似结构是
    主线程
    CreateThread(threadfunc,...);
    ....
    // 现在需要辅线程开始工作
    SetEvent(B);
    WaitForSingleObject(A, timeout);辅线程
    for(;;)
    {
    WaitForSingleObject(B,INFINITE);
    doDatabaseExec();
    SetEvent(A);
    }
      

  5.   

    差不多就是这个意思,然后完善一下结构就是了,比如如果timeout了需要收拾这个线程、重建线程,子线程检测退出信号之类的etc。