关于线程挂起和恢复问题?!!郁闷.......................

zhanghongbo1126 2009-05-11 10:46:14
大侠们好!
小弟遇到一个问题。非常棘手,希望大家帮忙。

我用AfxBeginThread建立连个A、B线程,都读与同一个USB端口(键盘)中是否有数据可读。但一次只能由一个线程读取数据,
另一个线程给它挂起。

问题:当我用A线程读取键盘数据时没有错误。键盘来的按键数据都可以读取。但是,当我把A线程挂起,用B线程读取数据时。只要一恢复B线程
ResumeThread()B,则,B线程一恢复就有刚才A线程操作时的键盘按键数据。知道把A线程键盘数据读完后,才开始等待是否有键盘按键数据
进入。

是否,在A线程操作时键盘按键,同时,B线程也在后台运行?

怎么解决这个问题?


各位大侠,帮忙分析一下。

在线等................
...全文
248 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2009-05-12
  • 打赏
  • 举报
回复
你应该用同步机制来控制两个线程访问一个资源,而不是“挂起”,挂起的线程也可能占用着资源呢。
贝隆 2009-05-12
  • 打赏
  • 举报
回复
学习,帮顶
Ryanwen 2009-05-11
  • 打赏
  • 举报
回复
如果成功执行了SuspendThread()函数,B线程肯定会挂起,也不会在后台执行
A、B线程同属于一个进程,不知道你是如何读取按键消息的,如果都是读取的进程消息队列,那么B线程读取到A线程的按键消息也是有可能的,因为在A线程挂起之前并没有处理完所有按键消息.

你可以拦截进程消息队列,通过PostThreadMessage()函数直接给线程A派送消息,这样B线程就不会收到这个消息了
wutaihua 2009-05-11
  • 打赏
  • 举报
回复
消息的发送是用消息队列来完成的,有一定的次序性,而且有一定的延迟。A线程挂起后,不会从windows的消息队列中获取消息,队列B会收到A的数据是正常的,可否在B开始读消息的时候首先清空下。然后再读取。或者就是单独弄一个线程来读消息,通过分发机制来抛给不同的线程


CWinThread::PostThreadMessage

BOOL PostThreadMessage( UINT message, WPARAM wParam, LPARAM lParam );

返回值:
如果成功,则返回非零值;否则返回0。

参数: message 用户自定义消息的ID。
wParam 第一个消息参数。
lParam 第二个消息参数。

说明:
调用这个函数以向其它CWinThread对象发送一个用户自定义消息。发送的消息通过消息映射宏ON_THREAD_MESSAGE被映射到适当的消息处理函数。

请参阅:ON_THREAD_MESSAGE
fishion 2009-05-11
  • 打赏
  • 举报
回复
AfxBeginThread(.B..CREATE_SUSPENDED...)
Ghost90 2009-05-11
  • 打赏
  • 举报
回复
线程被挂起了是不会在运行的,造成你这种情况的原因可能是线程B运行的一半时被挂起,这时USB口的数据已经被线程B收到但没处理完,这时启动线程A 处理数据 当A处理完数据时线程B回复 出现你的情况。如果是这样的话最好用线程的互斥。

UNIT BThread(LPARAM lp)
{
while(1)
{
1.监听USB
2.接受数据 //这时线程被挂起
3.处理数据
4.清空缓存


}
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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