本文主要是介绍进度反馈慎用SendMessage,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
由于工作需要,编写了一个解析300M字符串的MFC小程序。为了显示出当前的解析进度,使用了MFC的消息:
void WorkThreadFunction()
{
UIWnd->PostMessage(WM_PROGRESS, BEGIN, NULL);
while(notEnd())
{
......
UIWnd->PostMessage(WM_PROGRESS, DATA, ProcessedLength);
}
UIWnd->PostMessage(WM_PROGRESS, END, NULL);
}
在实际运行中,发现END消息基本上都会在最后一个DATA消息之前到达。为修正该错误,将PostMessage改为SendMessage。结果发现,虽然消息的时序性得到了保证,却消耗了处理本身9倍的时间(100M的文本处理时间由2秒上升到20秒)。
解决的办法有两种:
1。减少发送DATA的次数。如果进度是用百分比或千分比表示的,则仅在百分比或千分比发生变动时才发送。
2。使用共享数据:工作线程中将进度数据保存,UI线程中使用定时器主动取得共享数据,然后显示出来:
enum enumState
{
BEGIN,
DATA,
END,
};
struct structProgressInfo
{
enumState State;
DWORD ProcessedLength;
}g_ProgressInfo;
void WorkThreadFunction()
{
g_ProgressInfo.State = BEGIN;
while(notEnd())
{
......
g_ProgressInfo.State = DATA;
g_ProgressInfo.ProcessedLength = ProcessedLength;
}
g_ProgressInfo.State = END;
}
CMyDialog::OnTimer()
{
switch(g_ProgressInfo.State)
{
....
}
}
这篇关于进度反馈慎用SendMessage的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!