描述:
用VC写了一个COM组件,在另一个VC建的Dialog Base的MFC程序中调用。
COM组件可以通过事件将进度信息和当时的运算数据返回Dialog Base的MFC程序中,
我想在事件响应中想把获得的进度显示在该窗体中,可是该窗体却只有等到COM组件运行结束后才会刷新显示的内容,在COM组件运行时界面呈假死机状态。
请问怎么做才能实时的现实刷新窗体呢?
求实例代码!急,谢谢!
解决方案1:
我认为这样也不能很好地刷新界面:
主线程里
//GetMessage
MSG msg;
GetMessage(&msg, 0, 0, 0);
//DispatchMessage
DispatchMessage(&msg);
GetMessage()函数是一个堵塞调用,一定要从消息队列读出一些消息才可以返回。
在计算线程里加入这一段话,计算即使不被卡死也得相当慢。
取消息和分发消息本来就是很耗时间的事情。
最好还是开个计算线程吧,那样会好些。
在计算线程里直接改变主界面进度,而不用
GetMessage()和DispatchMessage()。
原因:
主线程在运行for循环 Fire_SetProgress(i);时,COM把它挂起;COM在自己线程池里使用一个线程做事件回调,也即UpdateData(FALSE);是在这个线程调用的。另外,界面是由主线程维护的,但此时主线程阻塞(尽管此时UpdateData的消息已经发到该窗体),因此界面不能更新。
能显示最后的更新状态,是因为主线程退出for后,根据m_iProgress最后的值和消息队列里的更新消息来更新的。
用jiangsheng(蒋晟.MSMVP2004Jan)的方法可以解决:
for (i=1;i<RecordCount;i++)
{
//计算
Fire_SetProgress(i);
//GetMessage
MSG msg;
GetMessage(&msg, 0, 0, 0);
//DispatchMessage
DispatchMessage(&msg);
}
可能更好的方法是,新开一个线程去调用for循环,而不是用主线程。这样可以直接用你原来的代码
在运算过程中分发一下消息吧
for (i=1;i<RecordCount;i++)
{
//计算
Fire_SetProgress(i);
//GetMessage
//DispatchMessage
}