迷路的小孩 发表于 2010-10-29 16:38

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

VC中是否能够实现一个窗口创建并显示几秒后自动关闭?

Rainyboy 发表于 2010-10-29 16:49

本帖最后由 Rainyboy 于 2010-10-29 16:52 编辑

回复 迷路的小孩 的帖子

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

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

比如,是:


还是:




wqsong 发表于 2010-10-29 21:07

可以,与楼上同问。。。

wqsong 发表于 2010-10-29 21:47

本帖最后由 wqsong 于 2010-10-29 21:49 编辑

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

int main(void)
{
      /*do what you want to do*/
      printf("Sleep 2s from here!");
      Sleep(2000);
      return 0;
}MFC类比着写,注意释放对应窗口的所有相关资源以防止内存泄漏。

Rainyboy 发表于 2010-10-29 22:44

本帖最后由 Rainyboy 于 2010-10-29 22:45 编辑

回复 wqsong 的帖子

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


start = end = GetCurrentTime();
while( end - start < 2000)
{
   sleep(100);
   end = GetCurrentTime();
}
exit();

wqsong 发表于 2010-10-29 23:10

回复 Rainyboy 的帖子

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

我觉得获取时间本身计在时间片轮换中,在时间片轮换、循环判断以及函数调用,这些开销也挺大的,直到判断end - start也耗用不少时间。除非提高进程优先级,就像CPU-Z一样,一开始先卡半天,估计是在计算主频吧;@P。。。
针对这问题的话提高优先级有点小题大做了。。。

迷路的小孩 发表于 2010-11-1 09:59

Rainyboy 发表于 2010-10-29 16:49 static/image/common/back.gif
回复 迷路的小孩 的帖子

请问你选择的是哪个平台?


谢谢你的热情回复,我用的是MFC

迷路的小孩 发表于 2010-11-1 10:18

如果窗口是自己设计的,然后用ShowWindow显示,用destroywindow关闭
这个时候还能用sleep吗?

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

Rainyboy 发表于 2010-11-1 11:08

回复 迷路的小孩 的帖子

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

我再看看,好久没用MFC了,不过应该有类似于TIMER控件能产生TIMEOUT的消息,通过响应这个消息就可以实现定时了。

Rainyboy 发表于 2010-11-1 11:22

本帖最后由 Rainyboy 于 2010-11-1 11:25 编辑

添加这个消息响应函数

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

并在初始化函数BOOL CBBSMFCDlg::OnInitDialog()中加入:
SetTimer(1,5000,NULL);
就可以了。

迷路的小孩 发表于 2010-11-11 15:21

谢谢,可以了
页: [1]
查看完整版本: VC中如何实现一个窗口显示几秒后自动关闭?