阅读:1420回复:6
我的上位机应用程序为什么不能做别的工作?
我的任务是用68013做图像数据采集,现图像数据能进入微机,但我的微机程序一开始读图像数据后,就只能做这件事了,其他的菜单都没有反应,甚至窗口不能拖动,不能最大化,我的上位机流程如下图(程序对应“开始采集”菜单),其中判断是否检测到帧信号我用的
方法是:当帧信号产生时,用EP1端口的interrupt 方式送出两个 0XFF,主机用CYPRESS提供的IOCTL_EZUSB_BULK_READ读帧信号是否 到,如读到的不是两个0XFF就再读,当读到的是两个0XFF时,就接着读图像数据,然后显示,结束后再回去判断下一帧信号是否到。 我这样做为什么会使得程序的其他部分没有反应?做到这里被卡住 了,都不知道该学什么,和什么有关?是和多线程有关系吗? 该怎么解决,大家帮帮忙? |
|
|
沙发#
发布于:2004-03-10 00:25
从你的流程图来看,你的程序基本上是在死循环。
你或者在循环中加入如下代码。 或者开用多线程。 MSG myMsg; while(::PeekMessage(&myMsg, NULL, 0, 0, PM_REMOVE)) { if((WM_PAINT == myMsg.message)||(this->GetSafeHwnd() == myMsg.hwnd)||::IsChild(this->GetSafeHwnd(), myMsg.hwnd)) { ::TranslateMessage(&myMsg); ::DispatchMessage(&myMsg); } } |
|
|
板凳#
发布于:2004-03-10 10:32
:S
|
|
|
地板#
发布于:2004-03-10 13:02
否则你的程序怎么可能会有响应呢?
|
|
|
地下室#
发布于:2004-03-10 22:45
多谢兄弟的指点,但好像用你贴的这段程序,我的程序对它自己的菜单还是不能响应,可能是消息发出后,我的应用程序窗口接收到消息后因一直在循环而无法响应,可能得用多线程了吧!
如果开个线程,把我得循环放进去,这样应该可以响应我得菜单得其他功能了吧! |
|
|
5楼#
发布于:2004-03-12 12:52
我的这段代码只能保证响应OnPaint()或OnDraw()。代码中已经体现出来了:
if((WM_PAINT == myMsg.message)||(this->GetSafeHwnd() == myMsg.hwnd)||::IsChild(this->GetSafeHwnd(), myMsg.hwnd)) 所以,你在用Alt+Tab切换的时候,它应该能够重画。而你原来的程序应该不能。 如果你要所有的消息。则可以把上面的消息过滤删掉。 好像系统把我的代码转换成表情符号了。 :D |
|
|
6楼#
发布于:2004-03-12 13:05
是不是可以这个样子。
1、你的数据读写都在OnIdle里完成。 2、ReadFile使用Overlap模式。 3、ReadFile后立刻退出。 4、下一次执行OnIdle时,如果ReadFile没有结束立刻退出,如果结束处理数据,然后执行下一个ReadFile。 如此循环。应该可以。当然,程序的效率比较低。 |
|
|