while(1)
{
if(Adapt_Flag) //如果接收成功
{
Adapt_Flag = 2; //标志位置2 2013-3-5
//将数组ReceiveData的数据拷贝到数组SaveRcvData 2012-10-25
yIndex = 0;
while(yIndex < adpt_index)
{
SaveRcvData[xIndex] = ReceiveData[yIndex]; //数组SaveRcvData存放所有要显示的数据
xIndex++;
yIndex++;
}
SendCString(SendFrameArray[i+1]); //发送第二帧
break; //退出while(1)循环
}
}
Adapt_Flag这个标志位的初值为0,是在定时器的响应函数中置1。定时器是在对话框的OnInitDialog()函数中SetTimer(1,1,NULL);的
我调试的时候发现,当程序执行到while(1)中时,根本不会执行定时器里的程序。因为定时器的程序优先级较低。
请问下,要怎样才能在执行while(1)中的程序时,同时定时器中的程序也在执行?感谢各位了~
15 个解决方案
#1
多线程你试过了?
#2
再开个线程.GetMessage.
While里加Sleep
While里加Sleep
#3
把while(1)放到线程里面去做.因为大体的结构是
你这个while(1)应该是在DispatchMessage里面的操作,你不返回是没机会去处理其他任何的消息的.不光是这个WM_TIMER的问题.把这种操作放到另起的线程里面去做吧.
while (GetMessage())
{
TranslateMessage();
DispatchMessage();
}
你这个while(1)应该是在DispatchMessage里面的操作,你不返回是没机会去处理其他任何的消息的.不光是这个WM_TIMER的问题.把这种操作放到另起的线程里面去做吧.
#4
这几句话是什么意思呢?我不是很明白,我不知道怎么多开一个线程,可以说详细点吗?感谢
#5
AfxBeginThread创建一个线程
#6
你用的是MFC,里面也是类似的消息循环机制,也就是上面所说的,你的while一直在执行,那外面的GetMessage一直没有机会执行,所以不会处理Timer消息,线程你都不清楚的话,最简单的办法如下
while(1)
{
MSG msg;
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
if(Adapt_Flag) //如果接收成功
{
Adapt_Flag = 2; //标志位置2 2013-3-5
//将数组ReceiveData的数据拷贝到数组SaveRcvData 2012-10-25
yIndex = 0;
while(yIndex < adpt_index)
{
SaveRcvData[xIndex] = ReceiveData[yIndex]; //数组SaveRcvData存放所有要显示的数据
xIndex++;
yIndex++;
}
SendCString(SendFrameArray[i+1]); //发送第二帧
break; //退出while(1)循环
}
}
#7
多线程
#8
按照你这样弄,第一次运行时显示正确了。但是我第二次打开对话框,运行时,还是显示不了数据。
为什么呢?谢谢你啦~
#9
第一次和第二次是独立运行的程序还是同一次的运行的两次操作,检查你的逻辑,还有就是多执行两次
for (int i = 0; i < 4; i++)
{
MSG msg;
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#10
\
放在线程里:
while(1)
{
if( 某个事件发生)
break;
else
{
do...something
}
sleep(2000); //2s 等同于一个定时器
};
放在线程里:
while(1)
{
if( 某个事件发生)
break;
else
{
do...something
}
sleep(2000); //2s 等同于一个定时器
};
#11
是一个程序运行两次。第一次显示正确,后来运行都没有数据显示。而且关闭对话框时,程序不能退出系统,非要点击“停止调试”才退出系统。还是不行啊
#12
参考10楼
不退出的原因:
wm_close没有及时收到吧?
请查看 是否消息没有及时收到
第二:
onclose函数或者oncancel函数的代码。
贴出来
#13
最好还是去看看线程的资料,弄个线程来做,我说的这个是一个最笨的,而且会导致很多问题.
for (int i = 0; i < 4; i++)
{
MSG msg;
if (!GetMessage(&msg, NULL, 0, 0))
ExitProcess(0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#14
显示数据的代码就没有看到在哪里,是 另一个程序吗?
#15
嗯,谢谢你,明天结贴,40分都给你。感觉你很有耐心,呵呵,我是新手,需要多多努力~
#1
多线程你试过了?
#2
再开个线程.GetMessage.
While里加Sleep
While里加Sleep
#3
把while(1)放到线程里面去做.因为大体的结构是
你这个while(1)应该是在DispatchMessage里面的操作,你不返回是没机会去处理其他任何的消息的.不光是这个WM_TIMER的问题.把这种操作放到另起的线程里面去做吧.
while (GetMessage())
{
TranslateMessage();
DispatchMessage();
}
你这个while(1)应该是在DispatchMessage里面的操作,你不返回是没机会去处理其他任何的消息的.不光是这个WM_TIMER的问题.把这种操作放到另起的线程里面去做吧.
#4
这几句话是什么意思呢?我不是很明白,我不知道怎么多开一个线程,可以说详细点吗?感谢
#5
AfxBeginThread创建一个线程
#6
你用的是MFC,里面也是类似的消息循环机制,也就是上面所说的,你的while一直在执行,那外面的GetMessage一直没有机会执行,所以不会处理Timer消息,线程你都不清楚的话,最简单的办法如下
while(1)
{
MSG msg;
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
if(Adapt_Flag) //如果接收成功
{
Adapt_Flag = 2; //标志位置2 2013-3-5
//将数组ReceiveData的数据拷贝到数组SaveRcvData 2012-10-25
yIndex = 0;
while(yIndex < adpt_index)
{
SaveRcvData[xIndex] = ReceiveData[yIndex]; //数组SaveRcvData存放所有要显示的数据
xIndex++;
yIndex++;
}
SendCString(SendFrameArray[i+1]); //发送第二帧
break; //退出while(1)循环
}
}
#7
多线程
#8
按照你这样弄,第一次运行时显示正确了。但是我第二次打开对话框,运行时,还是显示不了数据。
为什么呢?谢谢你啦~
#9
第一次和第二次是独立运行的程序还是同一次的运行的两次操作,检查你的逻辑,还有就是多执行两次
for (int i = 0; i < 4; i++)
{
MSG msg;
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#10
\
放在线程里:
while(1)
{
if( 某个事件发生)
break;
else
{
do...something
}
sleep(2000); //2s 等同于一个定时器
};
放在线程里:
while(1)
{
if( 某个事件发生)
break;
else
{
do...something
}
sleep(2000); //2s 等同于一个定时器
};
#11
是一个程序运行两次。第一次显示正确,后来运行都没有数据显示。而且关闭对话框时,程序不能退出系统,非要点击“停止调试”才退出系统。还是不行啊
#12
参考10楼
不退出的原因:
wm_close没有及时收到吧?
请查看 是否消息没有及时收到
第二:
onclose函数或者oncancel函数的代码。
贴出来
#13
最好还是去看看线程的资料,弄个线程来做,我说的这个是一个最笨的,而且会导致很多问题.
for (int i = 0; i < 4; i++)
{
MSG msg;
if (!GetMessage(&msg, NULL, 0, 0))
ExitProcess(0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#14
显示数据的代码就没有看到在哪里,是 另一个程序吗?
#15
嗯,谢谢你,明天结贴,40分都给你。感觉你很有耐心,呵呵,我是新手,需要多多努力~