MFC 处理大量数据查询 设置的进度条

lbmshiwo 2011-05-09 05:18:17
就是在MFC中查询大量数据时,停留的时间过长,想用一个进度条来表示,搜索过网上不少的例子,但没有相对完整的,别只是说一些多线程+进度条+消息的话,在下也知道,但我只是新手,片断的代码解决不了问题,请各位大师发一个相对完整的例子给我,最好是打包的类,在下感激不尽,可发邮件给我,谢谢,fwbluesun@163.com
...全文
469 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
神-气 2011-05-18
  • 打赏
  • 举报
回复
你在主线程中写工作的代码会堵塞主线程的窗口消息的,比较好的方法是创建一个工作线程,然后在主线程中使用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;
}
oyljerry 2011-05-14
  • 打赏
  • 举报
回复
http://blog.csdn.net/ShiZhixin/archive/2009/09/07/4528743.aspx
lbmshiwo 2011-05-13
  • 打赏
  • 举报
回复
再踩多一脚,看来没希望了。
lbmshiwo 2011-05-13
  • 打赏
  • 举报
回复
"消息响应函数写在进度条类,消息却发到主窗口去了",啥意思?
work1s 2011-05-13
  • 打赏
  • 举报
回复
在就是注意检查下看你的消息是不是发送到正确的地方去了,我之前也出过这种问题,消息响应函数写在进度条类,消息却发到主窗口去了
work1s 2011-05-13
  • 打赏
  • 举报
回复
就放在 setProcess(value);语句的前边就可以了。
单线程更容易做啊,每返回一个值就发送一条更新的消息,跟踪下程序看哪里不对吧。
lbmshiwo 2011-05-12
  • 打赏
  • 举报
回复
翻到这段代码:
首先,定义一个关联事件:
#define WM_UPDATEDATA WM_USER + 1999 //定义事件
BEGIN_MESSAGE_MAP(CBinLogAnalyse, CDialog)
ON_MESSAGE(WM_UPDATEDATA, &CBinLogAnalyse::OnUpdateData) //让事件关联程序
END_MESSAGE_MAP()
第二,实现关联程序(返回类型一定要是LRESULT):
LRESULT CBinLogAnalyse::OnUpdateData(WPARAM wParam, LPARAM lParam)
{
int iTmp = (int)wParam;
m_process.SetPos(iTmp);//设置进度条的值
UpdateData(false);//实时更新主界面
return 0;
}
第三,创建一个独立的线程处理大程序
m_pMyThread = AfxBeginThread(MyThread, this);//MyThread为该大程序处理的入口函数,this为入口函数的参数
m_pMyThread = NULL;
第四,实现大程序逻辑
UINT CBinLogAnalyse::MyThread(LPVOID pParam)//注意返回类型为UINT
{
CBinLogAnalyse *pDlg = (CBinLogAnalyse *)pParam;
//这里添加计算过程
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);//向主线程发送消息更新进度条
}


想问一下,在这段程序中,我想把我的大程序处理的代码放上去,应该放在哪个地方呢?
lbmshiwo 2011-05-12
  • 打赏
  • 举报
回复
还是不行啊,,把大程序处理函数加进去之后进度条就不动了,程序处理完后进度条才动。
Eleven 2011-05-09
  • 打赏
  • 举报
回复
多线程吧
lbmshiwo 2011-05-09
  • 打赏
  • 举报
回复
我都说了,唉。。。
xiaohuh421 2011-05-09
  • 打赏
  • 举报
回复
大量数据就意味着处理时间,就会阻塞UI,就要使用线程来解决.

最懒的做法.

一个全局变量.保存当前处理进度.
一个定时器,每过一定时间读取这个全局变量值,并设置进度条位置.
在处理线程中修改一个全局变量的值,表示当前处理进度.

int g_pos=0;

OnTimer中;
OnTimer(...)
{
//设置当前进度位置.
}

线程函数中
void threadproc()
{
for(int i=0;i<100;++i)
{
g_pos=i;
}
}
dfasri 2011-05-09
  • 打赏
  • 举报
回复
多点学习的热情吧...这些是最基本的界面操作了, 不想编程就及早跳槽, 否则磨多几年, 想换工种就难了...高不成, 低不就. 看 WINDOWS程序设计 这本书, 肯定有你想要的东西

2,586

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧