读书人

请问:多线程有关问题SetWaitableTi

发布时间: 2012-03-29 12:53:12 作者: rapoo

请教:多线程问题,SetWaitableTimer
想进行数据采集,然后定时进行处理,因为数据采集的原因,必须进行定时处理,现在是在一个线程中进行数据接收并写入数据库,打算再开一个线程(下面的线程)进行定时处理。现在有一个问题,就是在TimerAPCRoutine函数进行的过程中,对数据库的操作是有问题的,猜想可能是此时在数据采集的线程中也有对数据库的操作所以冲突,请教下怎么使这两个线程同步,避免这种冲突。不会是仅仅加入waitsingleobject吧?运行的时候出现0xC0000005: Access violation reading location 0xfeeeff4a.此时 HRESULT _hr = raw_Open(Source, ActiveConnection, CursorType, LockType, Options);返回的是一个很大的负数(此时的数据库操作语句没有错误,是运行几分钟后才出现的错误)。谢谢~
DWORD MyDlg::TimerThreadFunc(LPVOID lpParam)
{
HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL);

LARGE_INTEGER liDueTime;
liDueTime.QuadPart=-300000000;

//Sleep(3000);

SetWaitableTimer(hTimer, &liDueTime, 10000, TimerAPCRoutine, pDlg, FALSE)

while(1)
{
SleepEx(INFINITE, TRUE);
}

CloseHandle(hTimer);
}



[解决办法]
运行的时候出现0xC0000005: Access violation reading location 0xfeeeff4a.
内存访问错误
你的两个线程要想同步,有很多种方法
关键看你的应用比较适合哪一种
WaitForSingleObject可以实现你的功能
不过单进程中线程同步的话,用临界区吧,简单点

感觉你要实现的功能简单,但是用到的技术却很深,适合吗?
[解决办法]

探讨
对mfc也不是很熟悉,现在要在原来的代码中添加处理过程。想问下,临界区是在线程中任何地方添加都可以吗?还是必须在线程while循环的起始和结尾处添加~谢啦

引用:

运行的时候出现0xC0000005: Access violation reading location 0xfeeeff4a.
内存访问错误
你的两个线程要想同步,有很多种方法
……

[解决办法]
你为啥要在apc里面执行数据库操作.不知道用wait么?

APC里面执行的东西貌似有些限制的。最好另外单开线程做数据库

void startTimer(){
HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL);

LARGE_INTEGER liDueTime;
liDueTime.QuadPart=-300000000;

SetWaitableTimer(hTimer, &liDueTime, 10000, NULL,NULL,true);

hThread=(HANDLE)_beginthreadex(NULL,0,timerThread,NULL,0,NULL)


}
unsigned__stdcalltimerThread(LPVOID){
while(g_bRun){
WaitForSingleObject(hTimer,INFINITE);
//......
//时间到,做你的操作

}

}


读书人网 >VC/MFC

热点推荐