情景是这个样子的,
我有一个程序,要不停的(每隔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);
}不知道这样的思路是否可行,因为要频繁的开线程,有点担心,而且这是一个监控程序,可靠性要求很高
我有一个程序,要不停的(每隔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);
}不知道这样的思路是否可行,因为要频繁的开线程,有点担心,而且这是一个监控程序,可靠性要求很高
没有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;
};
上面这段代码放在定时器里面吗?
2、CreateThread建议换成_beginthreadex
3、lz如果觉得频繁开新线程有问题(如果机器环境没什么压力,又5秒才执行一次,我觉得没什么问题,5秒,其实是一个很长的时间了),可以考虑这个线程一直运行,利用线程同步来处理。
另外没看明白,lz是要数据库执行完以后等5秒,还是等数据库操作执行5秒?如果执行超过5秒,怎么办?这些可能会小小影响程序结构。
另外有一位朋友microyzy给我的提示很好,就是一个线程来干这个事情, 但是我不是很理解什么是线程同步, 是不是就是两个EVENT,主线程等A,辅线程等B,类似结构是
主线程
CreateThread(threadfunc,...);
....
// 现在需要辅线程开始工作
SetEvent(B);
WaitForSingleObject(A, timeout);辅线程
for(;;)
{
WaitForSingleObject(B,INFINITE);
doDatabaseExec();
SetEvent(A);
}