本文目录一览:
用visual c++ 6.0可视化编程如何编写电子时钟
你好
我分长期和短期的学习来分别说一点我的建议
(1)如果你只是想通过短期时间突击来完成你这个vc6.0电子时钟的程序,而且当前时间已经不多,并且你又有一些c++的基础的情况下,我的建议是:
多找一些《《visual c++ 6.0编程实例》》的书,可以在迅雷里下载,也可以去书店找,运气好的话,可能书里面就有你做的这个例子,如果实在没有你的这个例子,那你就要首先想想你这个程序大致需要怎么做,比如说:首先确定是做个单文档的模式还是做个对话框的模式;其次是如何添加时钟的边框,如何画出指针;再次如何让表针转动等问题,有了这些问题以后,针对这些问题再去那些事例书中找对应的例子,完整的时钟例子虽然找不到,但是拆分以后的这些小步骤还是能找到的。以上就是针对你现在的基础我的一点建议。
(2)如果你以后打算从事VC的开发,下面是我的一些心得,希望能给你帮助:
1.首先是学习计算机系统的运行原理。你只有在较为深刻地了解了计算机系统的运行原理,才可能会理解代码为什么要这样写,理解一些低层的错误。在此推荐一本书,《深入了解计算机系统》,迅雷 上有下,它能让你在程序员的角度上,对计算机有个深刻的了解,很不错。
2.有了对计算机系统的运行原理的初步认识,下一步可以了解下windows的编程思想,掌握最基本的sdk编程,对于您进一步学vc好处莫大,推荐经典书籍《《window程序设计》》迅雷上也有下
3.孙鑫的《VC++从入门到精通视频教程》,vc的入门读物,比较容易理解
4.vc提高篇,推荐《深入解析Windows系统(第四版),深入剖析mfc程序的运行过程。
最后:了解点操作系统的原理对编程也是有好处的。了解一下Windows操作系统的底层原理是怎样的,虚拟内存是个什么东西,进程是什么,等等。
总得说来长期的学习,就是这几本书:
《深入了解计算机系统》《window程序设计》》《VC++深入详解》、《Windows环境下32位汇编语言程序设计》、
《Windows核心编程》、《深入解析Windows系统(第四版)》这几本书,应该是你学习编程的一个有效的过程
恩,好了,最后祝你好运!
如何在C++中如何编写得到微妙单位的时间的代码
百度, ctrlc, ctrlv。。。
c++ 毫秒,微妙级计时方法
在Windows平台下,常用的计时器有两种,一种是timeGetTime多媒体计时器,它可以提供毫秒级的计时。但这个精度对很多应用场合而言还是太粗糙了。另一种是QueryPerformanceCount计数器,随系统的不同可以提供微秒级的计数。对于实时图形处理、多媒体数据流处理、或者实时系统构造的程序员,善用QueryPerformanceCount/QueryPerformanceFrequency是一项基本功。
在Intel Pentium以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件,它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数。由于目前的CPU主频都非常高,因此这个部件可以达到纳秒级的计时精度。这个精确性是上述两种方法所无法比拟的。
在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中。由于EDX:EAX寄存器对恰好是Win32平台下C++语言保存函数返回值的寄存器,所以我们可以把这条指令看成是一个普通的函数调用。像这样:
inline unsigned __int64 GetCycleCount()
{
__asm RDTSC
}
但是不行,因为RDTSC不被C++的内嵌汇编器直接支持,所以我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31,如下:
inline unsigned __int64 GetCycleCount()
{
__asm _emit 0x0F
__asm _emit 0x31
}
以后在需要计数器的场合,可以像使用普通的Win32 API一样,调用两次GetCycleCount函数,比较两个返回值的差,像这样:
unsigned long t;
t = (unsigned long)GetCycleCount();
//Do Something time-intensive ...
t -= (unsigned long)GetCycleCount();
这个方法的优点是:
1.高精度。可以直接达到纳秒级的计时精度(在1GHz的CPU上每个时钟周期就是一纳秒),这是其他计时方法所难以企及的。
2.成本低。timeGetTime 函数需要链接多媒体库winmm.lib,QueryPerformance* 函数根据MSDN的说明,需要硬件的支持(虽然我还没有见过不支持的机器)和KERNEL库的支持,所以二者都只能在Windows平台下使用(关于DOS平台下的高精度计时问题,可以参考《图形程序开发人员指南》,里面有关于控制定时器8253的详细说明)。但RDTSC指令是一条CPU指令,凡是i386平台下Pentium以上的机器均支持,甚至没有平台的限制(我相信i386版本UNIX和Linux下这个方法同样适用,但没有条件试验),而且函数调用的开销是最小的。
3.具有和CPU主频直接对应的速率关系。一个计数相当于1/(CPU主频Hz数)秒,这样只要知道了CPU的主频,可以直接计算出时间。这和QueryPerformanceCount不同,后者需要通过QueryPerformanceFrequency获取当前计数器每秒的计数次数才能换算成时间。
这个方法的缺点是:
1.现有的C/C++编译器多数不直接支持使用RDTSC指令,需要用直接嵌入机器码的方式编程,比较麻烦。
2.数据抖动比较厉害。其实对任何计量手段而言,精度和稳定性永远是一对矛盾。如果用低精度的timeGetTime来计时,基本上每次计时的结果都是相同的;而RDTSC指令每次结果都不一样,经常有几百甚至上千的差距。这是这种方法高精度本身固有的矛盾。
下面是几个小例子,简要比较了三种计时方法的用法与精度
//Timer1.cpp 使用了RDTSC指令的Timer类//KTimer类的定义可以参见《Windows图形编程》P15
//编译行:CL Timer1.cpp /link USER32.lib
#include stdio.h
#include "KTimer.h"
main()
{
unsigned t;
KTimer timer;
timer.Start();
Sleep(1000);
t = timer.Stop();
printf("Lasting Time: %d\n",t);
}
//Timer2.cpp 使用了timeGetTime函数
//需包含mmsys.h,但由于Windows头文件错综复杂的关系
//简单包含windows.h比较偷懒:)
//编译行:CL timer2.cpp /link winmm.lib
#include windows.h
#include stdio.h
main()
{
DWORD t1, t2;
t1 = timeGetTime();
Sleep(1000);
t2 = timeGetTime();
printf("Begin Time: %u\n", t1);
printf("End Time: %u\n", t2);
printf("Lasting Time: %u\n",(t2-t1));
}
//Timer3.cpp 使用了QueryPerformanceCounter函数
//编译行:CL timer3.cpp /link KERNEl32.lib
#include windows.h
#include stdio.h
main()
{
LARGE_INTEGER t1, t2, tc;
QueryPerformanceFrequency(tc);
printf("Frequency: %u\n", tc.QuadPart);
QueryPerformanceCounter(t1);
Sleep(1000);
QueryPerformanceCounter(t2);
printf("Begin Time: %u\n", t1.QuadPart);
printf("End Time: %u\n", t2.QuadPart);
printf("Lasting Time: %u\n",( t2.QuadPart- t1.QuadPart));
}
求帮忙看这段代码什么意思?
这个程序一看就是数模接口的io,我没做过这,不过由于程序过于简单,我就从字面上来跟你翻译一下, 也希望你今后遇到该类问题能够自己思考。
输入 data
输出 ret
ADC_SCK2 根据名字来看是时钟信号,可能是用来同步的
ADC_DSO2 根据代码来看,是输出信号
ADC_DSI2 根据代码看是输入信号
函数中针对data每一字节进行检测,先将 ADC_SCK2 关闭,如果data最高位是1,ADC_DSI2开启,否者关闭,ret向左移一位,如果ADC_DSO2打开,ret的最低位被设为1,ADC_SCK2 打开,data向左移.
这段代码已经很清晰了: data是要从程序输入到端口的数据,ret是从端口读的数据,在一个时钟滴答里, 如果data的最高位是1,那么向端口发数据,否则不发, 发完后data的第二高位变成他的最高位,并且在同一时钟滴答内, 如果端口有像程序发一个bit数据, 那么将该数据存入ret。
最后效果是将数据写到端口,并 从端口获得数据,完成一个交换。 至于端口是什么,你自己应该最了解