声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4779|回复: 10

[C/C++] VC中如何实现一个窗口显示几秒后自动关闭?

[复制链接]
发表于 2010-10-29 16:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
VC中是否能够实现一个窗口创建并显示几秒后自动关闭?
回复
分享到:

使用道具 举报

发表于 2010-10-29 16:49 | 显示全部楼层
本帖最后由 Rainyboy 于 2010-10-29 16:52 编辑

回复 迷路的小孩 的帖子

请问你选择的是哪个平台?
就C++而言,有MFC,也有.NET的,这两种的实现是不一样的。

或者说你已有的这个项目是按照什么类型创建的?

比如,是:
1.jpg

还是:
2.jpg



发表于 2010-10-29 21:07 | 显示全部楼层
可以,与楼上同问。。。
发表于 2010-10-29 21:47 | 显示全部楼层
本帖最后由 wqsong 于 2010-10-29 21:49 编辑

不管那种,最简单的思路就是:执行完相应的代码,然后让进程Sleep一段时间,然后返回(console)或者释放资源(MFC)。
  1. #include <stdio.h>
  2. #include <windows.h>

  3. int main(void)
  4. {
  5.         /*do what you want to do*/
  6.         printf("Sleep 2s from here!");  
  7.         Sleep(2000);
  8.         return 0;
  9. }
复制代码
MFC类比着写,注意释放对应窗口的所有相关资源以防止内存泄漏。
发表于 2010-10-29 22:44 | 显示全部楼层
本帖最后由 Rainyboy 于 2010-10-29 22:45 编辑

回复 wqsong 的帖子

这个sleep(2000)可是休眠内核时间2000毫秒啊……如果想稍微精确一点定时还是获取时间好一点吧?
我们先不管实现,大概流程应该是:


  1. start = end = GetCurrentTime();
  2. while( end - start < 2000)
  3. {
  4.      sleep(100);
  5.      end = GetCurrentTime();
  6. }
  7. exit();
复制代码

发表于 2010-10-29 23:10 | 显示全部楼层
回复 Rainyboy 的帖子

个人觉得还行,调用Sleep函数线程(进程)挂起,交给操作系统管理,然后进程自身进入等待状态(定时器中断?),不占用CPU,本身不统计进程调度时间片切换耗用时间。。。
delay函数是不提交CPU。。。

我觉得获取时间本身计在时间片轮换中,在时间片轮换、循环判断以及函数调用,这些开销也挺大的,直到判断end - start也耗用不少时间。除非提高进程优先级,就像CPU-Z一样,一开始先卡半天,估计是在计算主频吧;@P。。。
针对这问题的话提高优先级有点小题大做了。。。
 楼主| 发表于 2010-11-1 09:59 | 显示全部楼层
 楼主| 发表于 2010-11-1 10:18 | 显示全部楼层
如果窗口是自己设计的,然后用ShowWindow显示,用destroywindow关闭
这个时候还能用sleep吗?

有人说这会出现不显示窗口内容的问题,不知道这是怎么回事?怎么解决呢?

评分

1

查看全部评分

发表于 2010-11-1 11:08 | 显示全部楼层
回复 迷路的小孩 的帖子

用SLEEP的话是会有这个问题,因为这时窗口对需要重绘窗体的事件进行响应了。

我再看看,好久没用MFC了,不过应该有类似于TIMER控件能产生TIMEOUT的消息,通过响应这个消息就可以实现定时了。
发表于 2010-11-1 11:22 | 显示全部楼层
本帖最后由 Rainyboy 于 2010-11-1 11:25 编辑

添加这个消息响应函数

  1. void CBBSMFCDlg::OnTimer(UINT_PTR nIDEvent)
  2. {
  3.       // TODO: 在此添加消息处理程序代码和/或调用默认
  4.       CDialogEx::OnTimer(nIDEvent);
  5.       KillTimer(1);
  6.       this->OnCancel();
  7. }

复制代码
并在初始化函数BOOL CBBSMFCDlg::OnInitDialog()中加入:
  1. SetTimer(1,5000,NULL);
复制代码
就可以了。
 楼主| 发表于 2010-11-11 15:21 | 显示全部楼层
谢谢,可以了
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-10 16:07 , Processed in 0.107691 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表