新手,遇到难题。在串口通讯中,全局函数获得数据后将其放入缓存区,局部函数要到缓存区取数处理。有两个方案:
第一种,局部函数计数一定时间后到缓存区取数,但由于此方案的计数(计时)精度有限,随着时间的增加,计时误差会扩散,不适合我现在面临的高数据率(115200及以上的波特率)和长时间的处理。
因此只剩下第二种,全局函数将数据放入缓存区之后触发局部函数到缓存区取数。但我现在使用的全局函数没有返回值,我怎样才能触发局部函数呢?跟人沟通过,说是可以通过消息、事件什么的触发。但我不知道怎么实现?
希望高手能帮我解决问题,谢谢!
第一种,局部函数计数一定时间后到缓存区取数,但由于此方案的计数(计时)精度有限,随着时间的增加,计时误差会扩散,不适合我现在面临的高数据率(115200及以上的波特率)和长时间的处理。
因此只剩下第二种,全局函数将数据放入缓存区之后触发局部函数到缓存区取数。但我现在使用的全局函数没有返回值,我怎样才能触发局部函数呢?跟人沟通过,说是可以通过消息、事件什么的触发。但我不知道怎么实现?
希望高手能帮我解决问题,谢谢!
UINT MyProc(LPVOID pParam)
{
CXXXDlg *pDlg=(CXXXDlg*)pParam; pDlg->func()//主Dlg你想使用的函数
}注意:数据处理函数,监视串口函数,别放在pDlg里面,影响主界面的显示效率的
其次有两个解决方案:
1.接收到数据后,直接调用局部函数处理,不要放到缓冲区中。
2.创建一个接收队列作为缓冲区,创建一个事件,启动一个处理线程(你说的局部处理函数)
处理线程的逻辑:进入临界区(加锁)
while(队列中存在数据)
{
数据出队
处理
}
else
{
事件设置为无信号状态
出临界区(解锁)
WaitForSingleObject(hEvent);//等待事件
}接收的逻辑:加锁
接收的数据加入队列
设置事件为有信号状态,使得处理线程立即结束Wait,处理队列中的数据
解锁总之需要一个临界区和一个事件来处理线程同步,临界区保护队列不被同一时间访问,以免造成冲突。事件用于通知队列中有数据时,立即处理,就避免了你定时器去定期查询造成的效率问题,和不及时问题。
while(TRUE)
{
进入临界区(加锁)
if(队列中存在数据)
{
数据出队
出临界区(解锁)
处理
}
else
{
事件设置为无信号状态
出临界区(解锁)
WaitForSingleObject(hEvent);//等待事件,直到接收收到数据后,将其设置为有信号状态
}
}
2 可以添加一个全局的回调函数指针和使用类的指针, 在使用类中添加静态函数,全局函数中可以调用这个提供的回调函数, 如 typedef BOOL (CALLBACK *CALLBACKPROC)(LPVOID pUser, LPBYTE pBuff, DWORD dwBuffSize);
CALLBACKPROC pCallbackProc = NULL;
LPVOID pUser = NULL;
//全局函数
GlobalFun()
{
……
if(pCallbackProc && pUser)
{
pCallbackProc(pUser, buffer, buffsize);
}
} //局部函数
class User
{
static BOOL CALLBACK ProcFun(LPVOID pUser, LPBYTE pBuff, DWORD dwBuffSize)
{
User *pThisClass = (User*)pUser;
//处理数据
} void InitFun()
{
//其它初始化代码 pCallbackProc = ProcFun;
pUser = this;
}
};3 可以用事件,全局函数中SetEvent,局部使用启动一个线程等待事件