MFC 处理大量数据查询 设置的进度条
就是在MFC中查询大量数据时,停留的时间过长,想用一个进度条来表示,搜索过网上不少的例子,但没有相对完整的,别只是说一些多线程+进度条+消息的话,在下也知道,但我只是新手,片断的代码解决不了问题,请各位大师发一个相对完整的例子给我,最好是打包的类,在下感激不尽,可发邮件给我,谢谢,fwbluesun@163.com
[最优解释]
大量数据就意味着处理时间,就会阻塞UI,就要使用线程来解决.
最懒的做法.
一个全局变量.保存当前处理进度.
一个定时器,每过一定时间读取这个全局变量值,并设置进度条位置.
在处理线程中修改一个全局变量的值,表示当前处理进度.
int g_pos=0;
OnTimer中;
OnTimer(...)
{
//设置当前进度位置.
}
线程函数中
void threadproc()
{
for(int i=0;i<100;++i)
{
g_pos=i;
}
}
[其他解释]
就放在 setProcess(value);语句的前边就可以了。
单线程更容易做啊,每返回一个值就发送一条更新的消息,跟踪下程序看哪里不对吧。
[其他解释]
http://blog.csdn.net/ShiZhixin/archive/2009/09/07/4528743.aspx
[其他解释]
你在主线程中写工作的代码会堵塞主线程的窗口消息的,比较好的方法是创建一个工作线程,然后在主线程中使用MsgWaitMutipleObjects()函数,这个函数不会影响窗口消息的分发。
创建工作线程的时候把进度条的句柄的指针传进去,再判断进度并向进度条发送调整进度的消息PostMessge()
hWorkThread=CreateThread(NULL,0,ThreadProc,LPVOID(tb),0,&dwThreadId); //LPVOID(tb)这个就是进度条 或者窗口的句柄指针
while(TRUE)
{
result = MsgWaitForMultipleObjects(1, &hWorkThread, FALSE, INFINITE, QS_ALLINPUT);
if (result == (WAIT_OBJECT_0))//子线程结束,跳出循环,否则主线程阻塞在这里
{
break;
}
else//不影响正常的消息配发
{
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
DispatchMessage(&msg);
}
}
DWORD WINAPI ThreadProc (LPVOID pParam) //工作线程
{
....
PostMessage(...); //从pParam中取出传入的指针
return 0;
}
//这里添加计算过程
char sRtnMsgBuf[MAXPATH];
memset(sRtnMsgBuf, 0, MAXPATH);
int iRec = pDlg->ProcessLogFile(pDlg->m_sSaveFile, sRtnMsgBuf, MAXPATH);//调用具体处理大程序的逻辑函数
return 0;
}
第五,向主线程发送消息让进度条实时更新
int CBinLogAnalyse::ProcessLogFile(const char *pSaveFile, char *pRtnMsgBuf, int ibufLen)
{
if (NULL == pSaveFile)
{
return -1;
}
...
while(...)
{
...
//调用进度条实时更新函数实时更新进度条
setProcess(value);
}
}
//进度条实时更新函数
void CBinLogAnalyse::setProcess(int value)
{
SendMessage(WM_UPDATEDATA, value);//向主线程发送消息更新进度条
}
想问一下,在这段程序中,我想把我的大程序处理的代码放上去,应该放在哪个地方呢?
[其他解释]
还是不行啊,,把大程序处理函数加进去之后进度条就不动了,程序处理完后进度条才动。
[其他解释]
再踩多一脚,看来没希望了。
[其他解释]
在就是注意检查下看你的消息是不是发送到正确的地方去了,我之前也出过这种问题,消息响应函数写在进度条类,消息却发到主窗口去了
[其他解释]
"消息响应函数写在进度条类,消息却发到主窗口去了",啥意思?
[其他解释]
该回复于2011-05-18 13:51:30被版主删除