江湖救急!!关于线程控制权的问题.

xiejinwang 2004-05-10 10:10:28
我的程序中的辅助线程用于串口收发数据,主线程负责显示/处理数据,当辅助线程收到串口发来的数据时,会用一个消息通知我的界面线程,同时将收到的数据通过参数传递给界面线程的OnReceive()函数.

void CTestDlg::OnReceived(WPARAM wParam,LPARAM lParam)
{
m_str+=wParam;//wParam是串口收到的字符,例如"AB"
}

我想在界面线程的一个OnButten()函数里等待m_str的变化:
void CTest311Dlg::OnButton1()
{ .......//先给串口发数据,而后等待回应,判断是否是"AB"
while(m_str!="AB")
{;}//**
......
}
执行时,界面线程在while(m_str!="AB")处死循环,占用了线程,使界面线程无法处理辅助线程发来的串口消息,当然也就无法使m_str=="AB".请问如何让while(m_str!="AB")函数每次循环让出线程控制权?是不是在**处加上什么函数?
...全文
81 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
enoloo 2004-05-10
  • 打赏
  • 举报
回复
t2 = t1;
time(&t1); //换一下。

敲得太快了。
enoloo 2004-05-10
  • 打赏
  • 举报
回复
time_t t1; //
time_t t2;
time(&t2);//获得当前时间
time(&t1);
while( t1 -t2 < 10 )
{
...
time(&t1);
t2 = t1;
}

包含<time.h>
xxf2002 2004-05-10
  • 打赏
  • 举报
回复
你需要 #include "time.h"
time tt;定义一个时间变量
time(0)取系统的当前时间,单位毫秒?
xiejinwang 2004-05-10
  • 打赏
  • 举报
回复
xxf2002(xxf2002):
你的延时函数思路非常好!可是编译出错?
请就time tt;tt = time(0);的使用作以说明!


xxf2002 2004-05-10
  • 打赏
  • 举报
回复
走人了,有事发消息
xxf2002 2004-05-10
  • 打赏
  • 举报
回复
老大!
time函数 取得时间,我上面的例子是非诸塞等待10秒(还是毫秒?我忘了)的时间。
看看系统函数time的说明把。
xiejinwang 2004-05-10
  • 打赏
  • 举报
回复
xxf2002(xxf2002):
time tt;
tt = time(0);//怎样理解?什么用法?time??
xxf2002 2004-05-10
  • 打赏
  • 举报
回复
MSG msg;
time tt;
tt = time(0);
while( ( time(0) - tt ) < 10 )
{
if(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
xiejinwang 2004-05-10
  • 打赏
  • 举报
回复
我测试的是线程堵塞,在延时过程中不能收到消息.
那有没有能够达到延时等待效果的,又不堵塞线程的函数呢?
xiejinwang 2004-05-10
  • 打赏
  • 举报
回复
to: realjqcj(巴山夜)
SetTimer当然可以,定时后不又跑到OnTimer()函数里了?那跟在OnReceived里不一样吗?! 我的目的是在OnButton1()里判断!!
xxf2002 2004-05-10
  • 打赏
  • 举报
回复
线程堵塞 在延时过程中不能收到消息,你可以测试一下
xiejinwang 2004-05-10
  • 打赏
  • 举报
回复
xxf2002(xxf2002)的方法可以,基本可以实现我的意图,我再看一下,谢谢.
另外我想知道Sleep()函数在延时过程中线程是否堵塞?即在延时过程中能否收到消息?
realjqcj 2004-05-10
  • 打赏
  • 举报
回复
SetTimer
xxf2002 2004-05-10
  • 打赏
  • 举报
回复
**处可以加上
MSG msg;

if(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
xiejinwang 2004-05-10
  • 打赏
  • 举报
回复
那Sleep(50)在延时过程中线程是否堵塞?我感觉好像堵!
我本来也是把这个判断放到OnReceived里,但是我需要在OnButton1()判断收到的数据(即地址)是否正确,地址不对我要重发.如果把这个判断放到OnReceived里会出现其它的问题.还有其它办法吗?
isdong 2004-05-10
  • 打赏
  • 举报
回复
这种设计在逻辑上就是错误的。应该把这个判断放到收到线程消息的处理函数中,且没有while循环。while中加上sleep(50)也可以在一定程度缓解你的程序带来的问题,但不是好办法

void CTest311Dlg::OnButton1()
{ .......//先给串口发数据,而后等待回应,判断是否是"AB"
while(m_str!="AB")
{
Sleep(50);
;}//**
......
}
xiejinwang 2004-05-10
  • 打赏
  • 举报
回复
谢谢各位的帮助, 尤其是xxf2002.关于怎样实现一个不堵塞线程的延时函数的问题,我会再开帖与各位探讨的.
xiejinwang 2004-05-10
  • 打赏
  • 举报
回复
TO xxf2002(xxf2002):
用下面的你的方法作延时器时,延时时间是秒级的而且明显延时时间大于定时时间10,只有去掉if(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
这段后才算准确.当然,这也超出了我最初的问题.
MSG msg;
time_t tt;
tt = time(0);
while( ( time(0) - tt ) < 10 )
{
if(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
xiejinwang 2004-05-10
  • 打赏
  • 举报
回复
time(0)取系统的当前时间,单位秒!精度差了点!

16,472

社区成员

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

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

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