由于工作需要,编写了一个解析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)
{
....
}
}
本文介绍了解决MFC应用程序中多线程处理大量数据时进度同步的问题。通过对比PostMessage与SendMessage的方法,提出了两种解决方案:一是减少进度更新频率;二是采用共享内存的方式,并利用UI线程的定时器来读取进度。
1627

被折叠的 条评论
为什么被折叠?



