`

进度条Dialog线程

 
阅读更多

1.创建相应进度条Dialog

#include "stdafx.h"
#include "ReadTiff.h"
#include "ProgressDlg.h"


// CProgressDlg 对话框

UINT ThreadFunc(LPVOID lpParam)//线程函数
{
CProgressCtrl* pInfo=(CProgressCtrl*)lpParam;//线程函数参数
for(int pos=0;pos<30;pos++)
{
pInfo->SetPos(pos);//设置进度条进度
Sleep(50);//停止0.5秒
if(pos>=29)
{
pos=0;
}
}
return 0;
}
IMPLEMENT_DYNAMIC(CProgressDlg, CDialog)

。。。。。。。。。。。。。。。。


// CProgressDlg 消息处理程序

BOOL CProgressDlg::On<wbr>InitDialog()<br> {<br> CDialog::On<wbr>InitDialog();</wbr></wbr>

// TODO: 在此添加额外的初始化
m_progress.SetRange(0,30);//设置进度条范围

return TRUE; // return TRUE unless you set the focus to a control
}

void CProgressDlg::On<wbr>Paint()<br> {<br> CPaintDC dc(this); // device context for painting<br> //调用线程的处理函数<br> CWinThread* pThread=AfxBeginThread(ThreadFunc,&amp;m_progress);<br> }</wbr>

2.创建线程类

IMPLEMENT_DYNCREATE(CProgress, CWinThread)

。。。。。。。。

BOOL CProgress::InitInstance()
{
CProgressDlg *pDlg=new CProgressDlg

pDlg->Create(IDD_DIALOG_PROGRESS);//创建非模态对话框
pDlg->ShowWindow(SW_SHOW);//显示对话
//m_pMainWnd = pDlg;//将对话框设为主窗口
return TRUE;
}

int CProgress::ExitInstance()
{
return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CProgress, CWinThread)
END_MESSAGE_MAP()
}

3.在主程序中调用执行

CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CProgress),THREAD_PRIORITY_HIGHEST,0,NULL);

4.注:线程产生的dialog默认是主视图作为其父窗口

2.在已经开始执行某个线程时难于启动现在的线程

http://anwj336.blog.163.com/blog/static/894152092009624112340846/

http://apps.hi.baidu.com/share/detail/34609735

 

 

 

昨天一个同学问到为何界面上进度条被碰一下后就不动了。最直接的原因就是由于她采用的是单线程。所以手工写了个小例子来解决问题。

 

我直接采用C++类模板来实现这个过程。

1)首先我新建一个.h文件,不需要source文件,定义为命名为runsss.h,将该类改为模板类,然后只要在其中只写一个函数命名为insar(),这便是主函数,我们的大程序都可写在里面

.h文件的全部代码如下,很简单。

// runsss.h: interface for the runsss class.

template<class T1> class runsss;

template<class T1>

class runsss

{

public:

runsss();

virtual ~runsss();

BOOL Insar(){

for(int i=0;i<100000000.0;i++)

{

if(i%1000000==0)

g = (i/1000000);////这里的g就是进度,setpos里的参数值。

}

return true;

};

};

template<class T1>

runsss<T1>::runsss()

{}

 

template<class T1>

runsss< T1>::~runsss()

{}

#endif // !defined(AFX_RUNSSS_H__1B2FC4B5_B84E_419E_844C_1942B78A8DC0__INCLUDED_

(2)界面类

 

 

命名为:m_dia类。

建立’’执行的响应函数

建立timer事件,建立intital dialog事件。

进度条控件命名为:CProgressCtrlm_progress;

(1)m_dia.cpp外部声明模板类

runsss<UINT>run ;之后便可以在m_dia.cpp的任何地方调用runsss中的函数。

然后建调用线程的接口函数。

UINTInsars(LPVOID pParam)

{

return run.Insar();//这里就运行了类模板的函数了。

}

 

然后在执行的响应函数里建一个线程。来调用接口函数。

void m_dia::On<wbr>Button1()</wbr>

{

// TODO: Add your control notification handler co<wbr>de here</wbr>

AfxBeginThread(Insars, GetSafeHwnd(), THREAD_PRIORITY_NORMAL);//开辟新线程,//这样可以和界面线程分开。。。

}

 

最后在timer里设置进度条更新

void m_dia::On<wbr>Timer(UINT nIDEvent)</wbr>

{

// TODO: Add your message handler co<wbr>de here and/or call default</wbr>

m_progress.SetPos(g);

m_progress.UpdateWindow();

CDialog::On<wbr>Timer(nIDEvent);</wbr>

}

 

至于进度条的初始距离,以及步长等的设置,在initial对话框里进行。然后就OK了。

BOOL m_dia::On<wbr>InitDialog()</wbr>

{

CDialog::On<wbr>InitDialog();</wbr>

// TODO: Add extra initialization here

if(timer<0)

timer = SetTimer(1,100,NULL);

m_progress.SetRange(1,100);

m_progress.SetStep(5);

return TRUE;// return TRUE unless you set the focus to a control

}

 

void m_dia::On<wbr>Cancel()</wbr>

{

// TODO: Add extra cleanup here

if(timer>0)

KillTimer(1);

CDialog::On<wbr>Cancel();</wbr>

}

 

运行结果:

 

 

运行过程中,随意拖动对话框时,进度条不会停止。。

 

进度条Dialog线程 - 旺齐齐 - 宇宙的奇点

 

进度条Dialog线程 - 旺齐齐 - 宇宙的奇点
VC中进度条实时显示的解决方法
 

当我们在处理大程序时,常常需要耗很长时间,为了不让用户错误的认为系统已经死机,我们要给程序添加进度条,但是大家知道如果就直接添加进度条,并在程序里面控制它的进度,往往得到的结果是程序仍然像死机状态,直到处理完毕才显示进度条进度为100%,中间的过程看不到了,那么怎么办呢,是为什么呢?

原因是我们处理大程序和进度条显示是在同一个线程中进行的,这样往往因为处理大程序导致界面无法实时更新。

解决办法就是把处理大程序的这段逻辑让一个单独的线程在处理,并利用postmessage或sendmessage给主界面发送消息,让主界面去更新。

具体代码实现如下:

首先,定义一个关联事件:

#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);//向主线程发送消息更新进度条
}

 

转载自:http://zhou24388.blog.163.com/blog/static/59746327201172891943156/?suggestedreading&wumii

分享到:
评论

相关推荐

    仿IOS的自定义组合GroupDialog(更新版)

    这个是仿IOS的自定义组合...1、新增自定义水平进度条Dialog。 2、新增自定义环形进度条Dialog。 3、新增选择日期Dialog。 4、新增选择时间Dialog。 5、新增标题带有图标的Dialog。 6、优化进度条倒计时使用到的线程。

    Android 中通过实现线程更新Progressdialog (对话进度条)

    比如在应用商城下载软件时,当用户点击下载按钮,则会有下载进度提示页面出现,现在我们通过线程休眠的方式模拟下载进度更新的演示,如图(这里为了截图方便设置对话进度条位于屏幕上方): layout界面代码(仅部署...

    Java2实用教程.rar

    10 13带进度条的输入流 习题 第11章Java网络的基本知识 11 1使用URL 11 2读取URL中的资源 11 3显示URL资源中的HTML文件 11 4处理超链接 11 5InetAdress类 11 6套接字 11 7网络中的数据压缩与传输 11 8UDP数据报 11 9...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--android 挪动dialog的位置 |--android 控制对话框位置 |--android 根据uri获取路径 |--android 模拟器错误 |--android 横竖屏切换 |--android 获取mac地址 |--android 获取sd卡状态 |--android 设置apn |--...

    中国象棋.zip

    //创建新线程,启动界面 // m_hHandle=::CreateThread(0,0,SplashProc,this,0,&m_dwThreadID); // Sleep(1000); //加载开局库 m_pOpenBookTreeBackup=m_pOpenBookTree=new OPENBOOKTREENODE; LoadOpenBook(...

    android开发揭秘PDF

    4.2.12 对话框(Dialog) 4.2.13 图片视图(ImageView) 4.2.14 带图标的按钮(ImageButton) 4.2.15 拖动效果(Gallery) 4.2.16 切换图片(hmgeSwilcher) 4.2.17 网格视图(GridView) 4.2.18 卷轴视图(ScrollView) 4.2.19 ...

    《Android应用开发揭秘》附带光盘代码.

     4.2.12 对话框(Dialog)  4.2.13 图片视图(ImageView)  4.2.14 带图标的按钮(ImageButton)  4.2.15 拖动效果(Gallery)  4.2.16 切换图片(hmgeSwilcher)  4.2.17 网格视图(GridView)  4.2.18 卷轴视图...

    《Android应用开发揭秘》源码

     4.2.12 对话框(Dialog)  4.2.13 图片视图(ImageView)  4.2.14 带图标的按钮(ImageButton)  4.2.15 拖动效果(Gallery)  4.2.16 切换图片(hmgeSwilcher)  4.2.17 网格视图(GridView)  4.2.18 卷轴视图...

    Eclipse_Swt_Jface_核心应用_部分19

    11.3 其他线程访问UI线程 234 11.4 改进的进度条 236 11.5 多线程程序设计 238 11.6 本章小结 243 第12章 SWT系统资源 244 12.1 系统资源概述 244 12.1.1 什么是系统资源 244 12.1.2 释放资源的原则 ...

    android开发资料大全

    Android 所有Dialog 对话框 大合集 详解【附源码】 Android自定义View研究-- 一个小Demo Android调用相册拍照实现系统控件缩放切割图片 Android SQLite的实例汇总大全 两分钟彻底让你明白Android Activity生命周期...

    Android应用开发揭秘pdf高清版

    4.2.12 对话框(Dialog) 4.2.13 图片视图(ImageView) 4.2.14 带图标的按钮(ImageButton) 4.2.15 拖动效果(Gallery) 4.2.16 切换图片(hmgeSwilcher) 4.2.17 网格视图(GridView) 4.2.18 卷轴视图(ScrollView) 4.2.19 ...

    VB编程资源大全(源码 控制)

    cfdemo.zip 不用CommonDialog控件,使用API调用字体对话框 VB源码(281KB) 69,cmdlgd.zip 替换 Windows 公共对话框的 DLL 和演示程序的源代码,具有HOOK 功能(86KB) 70,colordlg.zip 不用Common...

    C# winform典型系统开发模板

     2.2.2 线程的应用 30  2.2.3 在Socket中发送大容量的消息 30  2.2.4 将流序列化或反序列化为对象 31  2.2.5 用InnerList列表记录信息 31  2.3 设计过程 32  2.3.1 类库的设计 33  2.3.2 ...

    Android 开发技巧

    2.1.10、Dialog风格的Activity 23 2.1.11、横竖屏切换不销毁当前Activity 23 2.2、INTENT RECEIVER 25 2.3、SERVICE 26 2.3.1、什么是Service 26 2.3.2、如何使用Service 27 2.3.3、Service的生命周期 32 2.3.4、...

    Android开发资料合集-World版!

    2.1.10、Dialog风格的Activity 23 2.1.11、横竖屏切换不销毁当前Activity 23 2.2、INTENT RECEIVER 25 2.3、SERVICE 26 2.3.1、什么是Service 26 2.3.2、如何使用Service 27 2.3.3、Service的生命周期 32 2.3.4、...

    C#开发典型模块大全

    5.2.2 打印预览对话框(PrintPreview Dialog) 95 5.2.3 打印对话框(PrintDialog) 96 5.2.4 获取指定颜色值和字体样式 97 5.2.5 DataGridView控件的相关应用 97 5.3 设计过程 98 5.3.1 打印信息的设置 98 ...

    KODExplorer 芒果云-资源管理器

    - 远程下载加入进度条,下载速度等信息 ####fix bug:(bug解决和程序优化) - 下载前判断当前目录可写 - 文件扩展名处理,分为用户方式和扩展名权限方式 - 上传结束提示:是否成功、失败原因 - 上传扩展名限制 ...

Global site tag (gtag.js) - Google Analytics