社区
界面
帖子详情
如何实现一个进度条界面,请高手指点一下,谢谢。
Dream_lover
2007-10-29 11:27:26
我需要实现一个带进度条的界面,进度条根据数据进行变化。 如果点击了取消按钮,则关闭该窗口。
现在的问题是, 我先用非模式的方式创建该窗口, 可以根据数据改变进度条, 但点击按钮没有响应。
用模式窗口试了一下, 直接阻塞到了主线程里,没办法执行到获取数据的逻辑里。
有点糊涂了,不知道该采用什么方式, 请高手指点一下,不胜感激。
...全文
447
15
打赏
收藏
如何实现一个进度条界面,请高手指点一下,谢谢。
我需要实现一个带进度条的界面,进度条根据数据进行变化。 如果点击了取消按钮,则关闭该窗口。 现在的问题是, 我先用非模式的方式创建该窗口, 可以根据数据改变进度条, 但点击按钮没有响应。 用模式窗口试了一下, 直接阻塞到了主线程里,没办法执行到获取数据的逻辑里。 有点糊涂了,不知道该采用什么方式, 请高手指点一下,不胜感激。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Dream_lover
2007-10-31
打赏
举报
回复
谢谢各位的指点, 前天已经弄好了,不过急着完成其它功能,没有时间,昨天论坛有问题,所以今天来结贴。
顺便总结一下我现在的实现:
1。主界面(主线程) 启动 一个工作线程, 用于计算数据,并根据数据更新 进度条窗口。(为了能直接在线程函数中显示进度条窗口,我将该窗口声明为static,我想今后可能会改成传递消息的方式,就不用受这个限制了)
2。工作线程中止,用postmessage 给主窗口发一个自定义消息,主界面响应该消息,用于刷新界面相应部分。
开始时的主要理解错误,就是windows的主界面(同时也是主线程),不能阻塞,否则,相应的窗口消息就没办法得到。
再次感谢 zaodt的详细描述。
Gavin001
2007-10-30
打赏
举报
回复
楼上的楼上,回答得非常详细,顺便学习一下
Jarrylogin
2007-10-29
打赏
举报
回复
看了你的逻辑,建议你使用C++ Build中的函数处理方法,可以直接更新界面(有专门的函数),这样比较符合你的逻辑
zaodt
2007-10-29
打赏
举报
回复
在WINDOWS下编程就要用事件和多线程的方法,不能再用DOS下单线程的老方法!
这里只能给你个思路:
1、分析你的数据处理过程,找出的规律,也就是确定何时该更新进度条;
2、建立一个新的 Worker Thread (工作线程没有用户界面),用它来进行数据处理;
3、在你的窗口中实现进度条界面,同时加入“取消”按钮;
4、在 Worker Thread 中,当达到更新进度条的条件时,向你的窗口发送消息,指定要更新进度条;
5、在窗口中响应这个消息,在响应函数中更新进度条;
6、当用户点击“取消”按钮时,改变全局变量;
7、在 Worker Thread 中,每做完一组计算操作时,都要判断这个全局变量,目的就是看是不是用户按了取消按钮;
8、如果用户在计算过程中按了“取消”按钮,那 Worker Thread 停止计算,结束线程;
说明:
整个过程对于初学者是很复杂的!
要实现以上方法,需要掌握以下几点:
1、多线程
2、在线程中发消息给主线程(需要传递窗口指针)
3、主线程响应消息
4、可能还要涉及到线程的同步问题
5、软件的逻辑,什么条件下给主线程发消息,要求更新进度条
不过,如果做过了,那就会明白一些WINDOWS编程的精髓了!
vcPlayer
2007-10-29
打赏
举报
回复
非模态、多线程。工作线程监视一个变量来停止工作,点击按钮时改变该变量为停止状态即可。
BBirdlyh
2007-10-29
打赏
举报
回复
用非模态会有以下问题:无法阻止用户对主对话框的操作,会引起问题
<<<<<用模式窗口试了一下, 直接阻塞到了主线程里,没办法执行到获取数据的逻辑里。 >>>>>
主窗口和进度条窗口需要用消息传递。得到的数据需要SENDMESSAGE到主窗口,主窗口SENDMESSAGE到进度条窗口来改变进度条的显示。
Dream_lover
2007-10-29
打赏
举报
回复
to i_love_pc:
能不能给个思路, 比如 多线程怎么分工? 我现在是点击主界面触发这个 进度条界面, 那么 处理线程该怎么分工呢 ?
我初步想,似乎界面和数据处理都需要死循环(或做定时任务)。
thisisyjs
2007-10-29
打赏
举报
回复
将数据传给对话框不要用SendMessage.
i_love_pc
2007-10-29
打赏
举报
回复
非模态+多线程!
Dream_lover
2007-10-29
打赏
举报
回复
我用的是 OnOK() ,因为只想关闭窗口,就没有区分。
请问 zhuwuwei, 如果用DestroyWindow(), 是不是采用 dlg.DestroyWindow() 这样的方式 ?
zhuwuwei
2007-10-29
打赏
举报
回复
你取消的响应函数是用的OnCancel()吧,那不管用,你用DestroyWindow()关闭对话框。
fronz
2007-10-29
打赏
举报
回复
添加线程,
把进度条处理函数放在后台线程中,
前台线程处理主窗口程序
Dream_lover
2007-10-29
打赏
举报
回复
我的逻辑大概如下:
while ( true)
{
获取数据....
if (ok)
{
break;
}
else
{
将数据传给非模式对话框
显示非模式对话框
Sleep(5000); //主线程休眠
}
}
这样,非模式对话框就不能响应按钮事件
ouyh12345
2007-10-29
打赏
举报
回复
同意楼上了。
另开线程处理数据,同时更新进度条
wjkgz
2007-10-29
打赏
举报
回复
用非模态的。
你说的点按钮没有响应,应该是因为你主线程里面一直在处理,导致界面没有响应了吧。
如果处理数据的操作,可以放到另外的线程里面做,那么就可以用多线程,再开一个线程来做。
要是不可以,那就再处理数据之后Sleep一下,让界面接收一下消息。
AccessAdmin v0.10 棕熊数据库管理
高手
请
指点
,处女作品!win2000+delphi7+access2000 从大富翁下载了离线数据库。太多的无用信息所以想把它清理
一下
其实用access也可以 不过下班后没有什么事情 所以写了
一个
小程序 用了suipack控件,www.sunistudio.com有试用版下载 源码开放,有兴趣的可以可以看看 比如欢迎窗口,放
一个
进度条
,感觉好看一些 限定程序只运行一次,并能激活已经运行的实例,用到了自定义消息。 更换软件
界面
,这个用suipack就很容易
实现
了 access数据库的基本操作等
通过AsyncTask
实现
上传
界面
进度条
、通知栏
进度条
同时刷新。
之前做
一个
项目,要求上传过程中,同时刷新上传
界面
中
进度条
和通知栏下拉页面中
进度条
。 一、我之前的做法是,在具体的下载方法中不停向两者发消息,通知更新进度。粗糙代码如下: while ((len = is.read(buffer)) != -1) {
java swt
进度条
_Java SWT
进度条
问题
请
教。
我有段程序:用swt的
进度条
来显示串口下载数据的进度。向串口总共发送500包数据,每发送完一包
进度条
加1.for(inti=0;i<500;i++){seria.send(data);//串口发送数据seria.receive();/...我有段程序:用swt的
进度条
来显示串口下载数据的进度。向串口总共发送500包数据,每发送完一包
进度条
加1.for(int i = 0; i < 50...
Qt
实现
复杂的列表控件
Qt
实现
复杂的列表控件[日期:2013-04-22]来源:Linux社区 作者:wangtaohappy[字体:大 中 小]有人问,复杂列表控件怎么做?控件布局如下图,求
指点
思路有
高手
指点
如下,红框圈起来的是QLabel,1个
进度条
,2个按钮(toolButton),1个布局,1个QWidget(容器),组成
一个
widget。放进QListWidget里。
进度条
用样式表美化
一下
,参考:点击这里。...
linux qt控件大全,Qt
实现
复杂的列表控件
有人问,复杂列表控件怎么做?控件布局如下图,求
指点
思路有
高手
指点
如下,红框圈起来的是QLabel,1个
进度条
,2个按钮(toolButton),1个布局,1个QWidget(容器),组成
一个
widget。放进QListWidget里。
进度条
用样式表美化
一下
,参考:点击这里。其中主要用这个函数:void QListWidget::setItemWidget(QListWidgetItem * ite...
界面
15,978
社区成员
115,866
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章