如何让定时器程序和while循环里的程序同时执行?

时间:2022-08-06 23:30:16
部分程序如下:
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

#3


把while(1)放到线程里面去做.因为大体的结构是

while (GetMessage())
{
    TranslateMessage();
    DispatchMessage();
}

你这个while(1)应该是在DispatchMessage里面的操作,你不返回是没机会去处理其他任何的消息的.不光是这个WM_TIMER的问题.把这种操作放到另起的线程里面去做吧.

#4


引用 3 楼 lostying 的回复:
把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}
你这个while(1)应该是在DispatchMessage里面的操作,你不返回是没机会去处理其他任何的消息的.不光是这个WM_TIMER的问题.把这种……
这几句话是什么意思呢?我不是很明白,我不知道怎么多开一个线程,可以说详细点吗?感谢

#5


引用 4 楼 yisiyou 的回复:
引用 3 楼 lostying 的回复:
把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}
你这个while(1)应该是在DispatchMessage里面的操作,你不返回是没机会去处理其他任何的消息的.不光是这个WM_TIM……

AfxBeginThread创建一个线程

#6


引用 4 楼 yisiyou 的回复:
引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}
你这个while(1)应该是在DispatchMessage里面的操作,你不返回是没机会去处理其他任何的消息的.……

你用的是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


多线程  如何让定时器程序和while循环里的程序同时执行?

#8


引用 6 楼 lostying 的回复:
引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}
你这个while(1)应该是在DispatchMessage里面的操作,你……

按照你这样弄,第一次运行时显示正确了。但是我第二次打开对话框,运行时,还是显示不了数据。
为什么呢?谢谢你啦~

#9


引用 8 楼 yisiyou 的回复:
引用 6 楼 lostying 的回复:引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}
你这个while(1)应该是在Di……

第一次和第二次是独立运行的程序还是同一次的运行的两次操作,检查你的逻辑,还有就是多执行两次

for (int i = 0; i < 4; i++)
{
MSG msg;
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}

#10


引用 6 楼 lostying 的回复:
引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}
你这个while(1)应该是在DispatchMessage里面的操作,你……
\


放在线程里:
while(1)
{
if( 某个事件发生)
break;
else
{
do...something
}

sleep(2000); //2s           等同于一个定时器 

};

#11


引用 9 楼 lostying 的回复:
引用 8 楼 yisiyou 的回复:引用 6 楼 lostying 的回复:引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}……

是一个程序运行两次。第一次显示正确,后来运行都没有数据显示。而且关闭对话框时,程序不能退出系统,非要点击“停止调试”才退出系统。还是不行啊

#12


引用 11 楼 yisiyou 的回复:
引用 9 楼 lostying 的回复:引用 8 楼 yisiyou 的回复:引用 6 楼 lostying 的回复:引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();   ……



参考10楼

不退出的原因:

wm_close没有及时收到吧?

请查看 是否消息没有及时收到

第二:

onclose函数或者oncancel函数的代码。

贴出来

#13


引用 11 楼 yisiyou 的回复:
引用 9 楼 lostying 的回复:引用 8 楼 yisiyou 的回复:引用 6 楼 lostying 的回复:引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();   ……


最好还是去看看线程的资料,弄个线程来做,我说的这个是一个最笨的,而且会导致很多问题.

for (int i = 0; i < 4; i++)
{
MSG msg;
if (!GetMessage(&msg, NULL, 0, 0))
   ExitProcess(0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}

#14


引用 11 楼 yisiyou 的回复:
引用 9 楼 lostying 的回复:引用 8 楼 yisiyou 的回复:引用 6 楼 lostying 的回复:引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();   ……


显示数据的代码就没有看到在哪里,是 另一个程序吗?

#15


引用 13 楼 lostying 的回复:
引用 11 楼 yisiyou 的回复:引用 9 楼 lostying 的回复:引用 8 楼 yisiyou 的回复:引用 6 楼 lostying 的回复:引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    Tr……

嗯,谢谢你,明天结贴,40分都给你。感觉你很有耐心,呵呵,我是新手,需要多多努力~

#1


多线程你试过了?

#2


再开个线程.GetMessage.
While里加Sleep

#3


把while(1)放到线程里面去做.因为大体的结构是

while (GetMessage())
{
    TranslateMessage();
    DispatchMessage();
}

你这个while(1)应该是在DispatchMessage里面的操作,你不返回是没机会去处理其他任何的消息的.不光是这个WM_TIMER的问题.把这种操作放到另起的线程里面去做吧.

#4


引用 3 楼 lostying 的回复:
把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}
你这个while(1)应该是在DispatchMessage里面的操作,你不返回是没机会去处理其他任何的消息的.不光是这个WM_TIMER的问题.把这种……
这几句话是什么意思呢?我不是很明白,我不知道怎么多开一个线程,可以说详细点吗?感谢

#5


引用 4 楼 yisiyou 的回复:
引用 3 楼 lostying 的回复:
把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}
你这个while(1)应该是在DispatchMessage里面的操作,你不返回是没机会去处理其他任何的消息的.不光是这个WM_TIM……

AfxBeginThread创建一个线程

#6


引用 4 楼 yisiyou 的回复:
引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}
你这个while(1)应该是在DispatchMessage里面的操作,你不返回是没机会去处理其他任何的消息的.……

你用的是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


多线程  如何让定时器程序和while循环里的程序同时执行?

#8


引用 6 楼 lostying 的回复:
引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}
你这个while(1)应该是在DispatchMessage里面的操作,你……

按照你这样弄,第一次运行时显示正确了。但是我第二次打开对话框,运行时,还是显示不了数据。
为什么呢?谢谢你啦~

#9


引用 8 楼 yisiyou 的回复:
引用 6 楼 lostying 的回复:引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}
你这个while(1)应该是在Di……

第一次和第二次是独立运行的程序还是同一次的运行的两次操作,检查你的逻辑,还有就是多执行两次

for (int i = 0; i < 4; i++)
{
MSG msg;
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}

#10


引用 6 楼 lostying 的回复:
引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}
你这个while(1)应该是在DispatchMessage里面的操作,你……
\


放在线程里:
while(1)
{
if( 某个事件发生)
break;
else
{
do...something
}

sleep(2000); //2s           等同于一个定时器 

};

#11


引用 9 楼 lostying 的回复:
引用 8 楼 yisiyou 的回复:引用 6 楼 lostying 的回复:引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();    DispatchMessage();}……

是一个程序运行两次。第一次显示正确,后来运行都没有数据显示。而且关闭对话框时,程序不能退出系统,非要点击“停止调试”才退出系统。还是不行啊

#12


引用 11 楼 yisiyou 的回复:
引用 9 楼 lostying 的回复:引用 8 楼 yisiyou 的回复:引用 6 楼 lostying 的回复:引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();   ……



参考10楼

不退出的原因:

wm_close没有及时收到吧?

请查看 是否消息没有及时收到

第二:

onclose函数或者oncancel函数的代码。

贴出来

#13


引用 11 楼 yisiyou 的回复:
引用 9 楼 lostying 的回复:引用 8 楼 yisiyou 的回复:引用 6 楼 lostying 的回复:引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();   ……


最好还是去看看线程的资料,弄个线程来做,我说的这个是一个最笨的,而且会导致很多问题.

for (int i = 0; i < 4; i++)
{
MSG msg;
if (!GetMessage(&msg, NULL, 0, 0))
   ExitProcess(0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}

#14


引用 11 楼 yisiyou 的回复:
引用 9 楼 lostying 的回复:引用 8 楼 yisiyou 的回复:引用 6 楼 lostying 的回复:引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    TranslateMessage();   ……


显示数据的代码就没有看到在哪里,是 另一个程序吗?

#15


引用 13 楼 lostying 的回复:
引用 11 楼 yisiyou 的回复:引用 9 楼 lostying 的回复:引用 8 楼 yisiyou 的回复:引用 6 楼 lostying 的回复:引用 4 楼 yisiyou 的回复:引用 3 楼 lostying 的回复:把while(1)放到线程里面去做.因为大体的结构是C/C++ code?12345while (GetMessage()){    Tr……

嗯,谢谢你,明天结贴,40分都给你。感觉你很有耐心,呵呵,我是新手,需要多多努力~