普通软件界面上的走动时间是如何实现的?

大_爱 2012-10-25 04:29:11
用while循环一直打印吗?一直打印要刷新界面不怎么好。

还是设置定时器,然后触发事件,打印时间,

打印时间其实也没什么问题,可是要不停的刷新客户端就有问题?这个不知道怎么做

好多外面挂的大屏幕显示时间,很稳定,没看出来,是刷新做的。

希望大家教教我如何做一个在客户端显示时间的思路,有思路就可以了。
...全文
281 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
苹果皮 2012-10-26
  • 打赏
  • 举报
回复
如果是win32 可以SetTimer一个定时器 1秒触发一次
然后在WM_TIMER里 获取信息 刷新界面
也可以开一个线程 Sleep(1000)然后更新界面
BlackGhost 2012-10-26
  • 打赏
  • 举报
回复
WM_TIMER的优先级很低,其它消息多的话,timer消息有时不能及时处理,怎么弄?
酱油党 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 10 楼 的回复:

如果是win32 可以SetTimer一个定时器 1秒触发一次
然后在WM_TIMER里 获取信息 刷新界面
也可以开一个线程 Sleep(1000)然后更新界面


设置定时器应该还算不错的思路,开一个线程sleep更新界面的话,那就有点不爽了,其实我现在就是用的这种方式。
[/Quote]线程那种问题很大,理论上是不允许多个线程操作界面的。这样就会需要线程间通讯的问题引入。感觉还是Timer用时间片解决比较好。
酱油党 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 10 楼 的回复:

如果是win32 可以SetTimer一个定时器 1秒触发一次
然后在WM_TIMER里 获取信息 刷新界面
也可以开一个线程 Sleep(1000)然后更新界面


设置定时器应该还算不错的思路,开一个线程sleep更新界面的话,那就有点不爽了,其实我现在就是用的这种方式。
[/Quote]线程那种问题很大,理论上是不允许多个线程操作界面的。这样就会需要线程间通讯的问题引入。感觉还是Timer用时间片解决比较好。
大_爱 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

如果是win32 可以SetTimer一个定时器 1秒触发一次
然后在WM_TIMER里 获取信息 刷新界面
也可以开一个线程 Sleep(1000)然后更新界面
[/Quote]

设置定时器应该还算不错的思路,开一个线程sleep更新界面的话,那就有点不爽了,其实我现在就是用的这种方式。
大_爱 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

看LZ以往都是做后台的。
前台个人觉得会比较悲剧,了解下基本的Windows编程吧。
[/Quote]

是啊,一直都是做后台的,有所了解Windows的基本编程,但是没怎么细学,总感觉都会,写代码的时候感觉什么都不会。
j8daxue 2012-10-25
  • 打赏
  • 举报
回复
看LZ以往都是做后台的。
前台个人觉得会比较悲剧,了解下基本的Windows编程吧。
大_爱 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

1、用Double Buffer才能使得画面切换比较平滑,建议查查这方面的资料先;
2、因为最频繁的是秒数,你的Timer用于采样,肯定要高于秒的频率,200ms只是一个参考。

引用 3 楼 的回复:

引用 2 楼 的回复:

1、设置窗体为Double Buffer模式,没有的话,自己构建双缓冲的显示机制;
2、开一个Timer,200ms触发一次,获取数据更新显示。
……
[/Quote]

Double Buffer 就是双缓冲(前缓冲和后缓冲),主要目的是为了避免图像闪烁,让玩家看不到绘图的过程,
前缓冲内容跟屏幕显示内容是一样的,后缓冲是作图区,图作好后再用glSwapBuffer()或Flip()函数传到前缓冲中,屏幕上就看到内容了。

多谢,我会努力学习这种技术。timer是用来计算时间的吗,提供将要显示的数据吗?这样高频率的定时器不会有问题吧?
图灵狗 2012-10-25
  • 打赏
  • 举报
回复
1、用Double Buffer才能使得画面切换比较平滑,建议查查这方面的资料先;
2、因为最频繁的是秒数,你的Timer用于采样,肯定要高于秒的频率,200ms只是一个参考。

[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

1、设置窗体为Double Buffer模式,没有的话,自己构建双缓冲的显示机制;
2、开一个Timer,200ms触发一次,获取数据更新显示。


我对C++不熟,dobule buffer是搞不来了, 200ms触发一次也是触发的缓存吗?
[/Quote]
大_爱 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

仅供参考C/C++ code
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <conio.h>
#include <time.h>
#include <math.h>
time_t t;
char timestr1[30];//……
[/Quote]

整复杂了,你给的代码我也看不懂,有思路即可,我也许要用在其他地方,我只是把这个问题抽象出来了。不过还是多谢谢你的,我先研究研究你的代码
大_爱 2012-10-25
  • 打赏
  • 举报
回复

其实我就要做一个类是的功能,要求时时走动的。
赵4老师 2012-10-25
  • 打赏
  • 举报
回复
仅供参考
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <conio.h>
#include <time.h>
#include <math.h>
time_t t;
char timestr1[30];//DDD MMM dd hh:mm:ss YYYY
char timestr2[30];//DDD MMM dd hh:mm:ss YYYY
char hhmmss[9];
int graphdriver,graphmode,page;
int i,xo,yo,r0,r1,r2,r3,r4,r5,r6,r7;
int x1,y1,x2,y2;
int hh,mm,ss;
double c,s;
int xasp,yasp;
void main() {
xo=60;yo=60;
r0=5; //轴
r1=20;//时针
r2=36;//分针
r3=45;//秒针
r4=50;//时刻度
r5=53;//分刻度
r6=55;//刻度外
r7=59;//表盘
graphdriver=VGA;
graphmode=VGAMED;
initgraph(&graphdriver,&graphmode,"C:\\BC\\BGI");
getaspectratio(&xasp, &yasp);
page=0;
timestr2[0]=0;
while (1) {
if (kbhit()) break;
time(&t);
strcpy(timestr1,ctime(&t));
if (strcmp(timestr1,timestr2)) {
strcpy(timestr2,timestr1);
hh=atoi(timestr2+11);
mm=atoi(timestr2+14);
ss=atoi(timestr2+17);
setvisualpage(page);
setactivepage(1-page);
cleardevice();
sprintf(hhmmss,"%02d:%02d:%02d",hh,mm,ss);
outtextxy(28,0,hhmmss);
pieslice(xo,yo,0,360,r0);
circle(xo,yo,r7);
for (i=0;i<60;i++) {
c=cos(i*6*3.14159265/180);
s=sin(i*6*3.14159265/180)*xasp/yasp;
if (0==(i%5)) {
x1=xo+r4*c;
y1=yo+r4*s;
} else {
x1=xo+r5*c;
y1=yo+r5*s;
}
x2=xo+r6*c;
y2=yo+r6*s;
line(x1,y1,x2,y2);
if (((hh%12)*5+mm/12+45)%60==i) {
x2=xo+r1*c;
y2=yo+r1*s;
setlinestyle(0,-1,3);
line(xo,yo,x2,y2);
setlinestyle(0,-1,1);
}
if ((mm+45)%60==i) {
x2=xo+r2*c;
y2=yo+r2*s;
setlinestyle(0,-1,3);
line(xo,yo,x2,y2);
setlinestyle(0,-1,1);
}
if ((ss+45)%60==i) {
x2=xo+r3*c;
y2=yo+r3*s;
line(xo,yo,x2,y2);
}
}
page=1-page;
}
delay(100);
}
getch();
closegraph();
}
大_爱 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

1、设置窗体为Double Buffer模式,没有的话,自己构建双缓冲的显示机制;
2、开一个Timer,200ms触发一次,获取数据更新显示。
[/Quote]

我对C++不熟,dobule buffer是搞不来了, 200ms触发一次也是触发的缓存吗?
图灵狗 2012-10-25
  • 打赏
  • 举报
回复
1、设置窗体为Double Buffer模式,没有的话,自己构建双缓冲的显示机制;
2、开一个Timer,200ms触发一次,获取数据更新显示。
大_爱 2012-10-25
  • 打赏
  • 举报
回复
希望C、C++论坛上面还有人

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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