具体情况大概是: static int flag=0; Function1() { ... CreateThread() ; //Run a thread,and it will cost some minutes ... flag=... //一个关于flag的操作 } CMainFrame::OneFunction() { for(int i=0;i<5;i++) { Function1(i); //需要等到前一个Function结束,才能开始下一个 Sleep(minutes); //wait for the result of "flag" } } 请问如何实现之,能够避免界面不能实时更新
function1() { Handle hThread = CreateThread();DWORD dwTimeout = 5000; // in milliseconds while ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT ) { MSG msg; while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { ::PostQuitMessage(nExitCode); break; } if (!AfxGetApp()->PreTranslateMessage(&msg)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } }}基本是这样。我没有测试随手写的。
让线程发消息给frame,再处理这个消息。
to: black_fox(咬你耳朵) ,谢谢你的答复先! 但是我还是没有特别看懂,如果按照你的这个写法,然后Thread()里面是不是还要::PostMessage(WM_RESPOND),然后加上我的这个消息ID的处理函数,就可以了?
static int flag=0;
Function1()
{
...
CreateThread() ; //Run a thread,and it will cost some minutes
...
flag=...
//一个关于flag的操作
}
CMainFrame::OneFunction()
{
for(int i=0;i<5;i++)
{
Function1(i);
//需要等到前一个Function结束,才能开始下一个
Sleep(minutes);
//wait for the result of "flag"
}
}
请问如何实现之,能够避免界面不能实时更新
{
Handle hThread = CreateThread();DWORD dwTimeout = 5000; // in milliseconds
while ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT )
{
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
::PostQuitMessage(nExitCode);
break;
}
if (!AfxGetApp()->PreTranslateMessage(&msg))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
} }}基本是这样。我没有测试随手写的。
但是我还是没有特别看懂,如果按照你的这个写法,然后Thread()里面是不是还要::PostMessage(WM_RESPOND),然后加上我的这个消息ID的处理函数,就可以了?
根据你的代码含义,你是要等待一个thread结束后重新启动一个,在flag等于某一个数值的时候进行其他操作而在等待的过程中界面由于不能及时的处理消息而不响应
我认为的问题是如下两个:
1、如何等待一个thread德结束 WaitForSingleObject可以实现
2、如何在等待的过程中继续消息循环 通过PeekMessage
PostMessage(WM_RESPOND)不指到是做什么用的,应该不需要。。因为function1本身必须等待thread结束后才能退出,这个时候界面不会停止相应的。还有其他的方式,比如采用信号量处理,PostMessage方法感觉不是太好。
但是对于每一个频率,要先执行一个探点(电压)的工作,比如为了合适这个频率的工作,需要加某一个电压,但是这个电压不是我事先知道的,是根据我的程序的结果得到的!这样,
Test( ) //我的实验程序
{
for(int i=0;i<5;i++)
BeginFreq(Freq[i]); //每一个频率的执行
}
但是我必须等到前一个频率的实验完成以后,才能继续下一个!否则数据采集就会发生紊乱
每一个频率的实验涉及到AD/DA部分,需要一定的时间才能完成!
所以需要等待某个时间(可以计算的到)
而BeginFreq()包括2个后台的Thread,一个是ADThread,一个是DAThread,
必须等到AD采集回来后计算到的电压值,分析后看是否满足我的条件,
if(采集回来的电压值==我的要求)
继续下一个频率的测量
else 改变我的DA中的参量,继续采集电压值,直到我的电压值满足要求(即我所说的探点过程)
但是同时我得需要在界面上实时显示我当前采集回来的数据值(正弦波),
所以,
1。如何等待我的线程的完成。应该在哪里加等待语句,加怎样的语句??
2。如何实现我的数据的实时更新而不是线在的界面无响应!
2 使用線程同步技術,如事件,信號量
将Test( )单独最为一个工作进程。
for(int i=0;i<5;i++){
BeginFreq(Freq[i]); //每一个频率的执行
WaitForMultipleObjects() //等待那两个AD和DA进程
PostMessage() //发消息给主线程,更新界面
}
while ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT )
是什么意思啊,还是应该是
while ( WaitForSingleObject ( hThread, dwTimeout ) != WAIT_TIMEOUT )
你的意思是用这个方法在这个等待的过程里继续消息循环?!
只是在等待的过程之间消息不会阻塞
while ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT )
{
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
::PostQuitMessage(nExitCode);
break;
}
if (!AfxGetApp()->PreTranslateMessage(&msg))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
} }