MFC多线程问题

li_rui_1220 2014-08-27 09:38:31
现在我有如下这样一个问题需要解决,求指导


我是通过一个运动板块控制电机运动,当我调用板卡提供的函数进行点到点运动,当函数执行完成后,但电机的运动还没有结束,我再次调用函数给下一个点的坐标电机运动的结果就不对了。
所以我就需要在调用完这个函数使用死循环等待标志位
while(Flag == 1)
{
Flag =GetFlag(); //这是我简单的描述
}
死循环等待标志位时程序就死在这了,我在定时器里的刷新程序就不好用了。

所以我想用多线程实现,不知道思路怎么搞好!非常感谢各位大侠帮忙解决一下!非常感谢!
...全文
210 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
li_rui_1220 2014-08-30
  • 打赏
  • 举报
回复
还没解决问题咧!继续指导指导啊
苦逼码农 2014-08-30
  • 打赏
  • 举报
回复
引用 2 楼 arpnet99 的回复:
SetEvent HANDLE m_hEvent; m_hEvent=CreateEvent(...) DWORD dwTimeout = 10000; if(WaitForSingleObject(m_hEvent,dwTimeout)==WAIT_OBJECT_0) { ResetEvent(m_hEvent); }
http://bbs.csdn.net/topics/390874435 帮忙看个帖子
li_rui_1220 2014-08-29
  • 打赏
  • 举报
回复
引用 2 楼 arpnet99 的回复:
SetEvent HANDLE m_hEvent; m_hEvent=CreateEvent(...) DWORD dwTimeout = 10000; if(WaitForSingleObject(m_hEvent,dwTimeout)==WAIT_OBJECT_0) { ResetEvent(m_hEvent); }
感觉理解起来还是比较费劲,我现在还没有创建线程,没有思路如何编写代码,我这个函数还有4个参数,怎么传入参数?麻烦指导一下,非常感谢了!! void Motorsys::sina() //画正玄曲线 { int i =0; double x[73]; double y[73]; for (i = 0;i < 73;i++) { y[i] = 30 * sin(5.0 * i / 180 * PI); x[i] = -i; } for (i = 0;i < 72;i++) { MoveLine(x[i],y[i],x[i+1],y[i+1]); } } void Motorsys::MoveLine(double x1,double y1,double x2,double y2) { double xs = x2-x1; double ys = y2-y1; Motors[0].motorv(xs ,800 *xs,10000); Motors[1].motorv(ys ,800*ys,10000); GetRR0Status( hDevice, &RR0); //读取寄存器的值 while(RR0.XDRV == 1 && RR0.YDRV == 1) { GetRR0Status( hDevice, &RR0); //读取寄存器的值 } }
li_rui_1220 2014-08-29
  • 打赏
  • 举报
回复
引用 8 楼 saylerboxer 的回复:
是死在这一句了吗? GetRR0Status( hDevice, &RR0);    //读取寄存器的值 这种操作应该不能死的 你判断下hDevice的值是否有效,调试看看,或者像下面这样 if (hDevice) GetRR0Status( hDevice, &RR0);  
程序执行到这不是死在这里。是读到寄存器中的值满足while(RR0.XDRV == 1 && RR0.YDRV == 1)程序结束。 不满足时代表电机还在运动。在电机运动时我有个定时器刷新电机运动状态,现在进入不了定时器刷新
猞猁狲 2014-08-29
  • 打赏
  • 举报
回复
是死在这一句了吗? GetRR0Status( hDevice, &RR0);    //读取寄存器的值 这种操作应该不能死的 你判断下hDevice的值是否有效,调试看看,或者像下面这样 if (hDevice) GetRR0Status( hDevice, &RR0);  
li_rui_1220 2014-08-29
  • 打赏
  • 举报
回复
引用 6 楼 saylerboxer 的回复:
可能你读寄存器的值太频繁了,你先改成下面这样试试

while(RR0.XDRV == 1 && RR0.YDRV == 1)
{
  Sleep(20);
  GetRR0Status( hDevice, &RR0);	//读取寄存器的值
}
其实你这个问题用多线程解决比较好,不过看你这个代码可能要改些结构
我这样修改过了,还是不行啊!
猞猁狲 2014-08-29
  • 打赏
  • 举报
回复
可能你读寄存器的值太频繁了,你先改成下面这样试试

while(RR0.XDRV == 1 && RR0.YDRV == 1)
{
  Sleep(20);
  GetRR0Status( hDevice, &RR0);	//读取寄存器的值
}
其实你这个问题用多线程解决比较好,不过看你这个代码可能要改些结构
fronz 2014-08-28
  • 打赏
  • 举报
回复
是说线程分工么? 在主程序中创建1工作线程,只负责监听电机运动状态及向主线程传递消息。 主线程负责后续处理工作及客户界面维护等。采用事件驱动就可以。
SiGoYi 2014-08-28
  • 打赏
  • 举报
回复
引用 2 楼 arpnet99 的回复:
SetEvent HANDLE m_hEvent; m_hEvent=CreateEvent(...) DWORD dwTimeout = 10000; if(WaitForSingleObject(m_hEvent,dwTimeout)==WAIT_OBJECT_0) { ResetEvent(m_hEvent); }
同上,使用Event来实现,可以使用WaitForSingleObject等待一个信号,也可以使用WaitForMultiObject等待多个信号量,如果怕卡UI,就创建一个线程,在线程中等待信号量就可以了。
这不是鸭头 2014-08-28
  • 打赏
  • 举报
回复
SetEvent HANDLE m_hEvent; m_hEvent=CreateEvent(...) DWORD dwTimeout = 10000; if(WaitForSingleObject(m_hEvent,dwTimeout)==WAIT_OBJECT_0) { ResetEvent(m_hEvent); }
li_rui_1220 2014-08-28
  • 打赏
  • 举报
回复
自己顶一下,求指导

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧