+ -
当前位置:首页 → 问答吧 → 请教:多线程问题,SetWaitableTimer

请教:多线程问题,SetWaitableTimer

时间:2011-11-29

来源:互联网

想进行数据采集,然后定时进行处理,因为数据采集的原因,必须进行定时处理,现在是在一个线程中进行数据接收并写入数据库,打算再开一个线程(下面的线程)进行定时处理。现在有一个问题,就是在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);
}

作者: liubj07   发布时间: 2011-11-29

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

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

作者: sky101010ws   发布时间: 2011-12-01

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

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

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

作者: liubj07   发布时间: 2011-12-01

定时处理和数据接收同在一个线程上不行吗?
为何要单独开启一个定时处理的线程?

作者: yuucyf   发布时间: 2011-12-01

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

引用 1 楼 sky101010ws 的回复:

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

临界区是来保护你需要的资源,防止多个线程同时访问的地方添加

作者: oyljerry   发布时间: 2011-12-01