主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

向下

软件延迟,与处理器速度无关? 找到类似的分支


kioto   (2002-07-13 00:36) [0]

告诉我如何以一定的时间以编程方式组织动作的延迟,与处理器的类型(速度)无关,精度为+ -1ms? 提前谢谢你。



BAY   (2002-07-13 00:49) [1]

我不知道这些功能。
但我会这样做:


T:=时间+ TimeDelay;
而T <>时间呢;



NailMan   (2002-07-13 01:12) [2]

程序等待(延迟:红衣主教); //毫秒延迟
Var LastCount,伯爵:红衣主教;
开始
最后:= GetTickCount;
重复
伯爵:= GettickCount;
直到Count> =(LastCount + Delay);
结束;

输入这么做延迟。



sunwheel   (2002-07-13 09:33) [3]

看看睡眠功能



Anatoly Podgoretsky   (2002-07-13 10:51) [4]

整个问题在于声明的高精度,它超出了操作系统的功能。



Proton   (2002-07-13 19:37) [5]

2BAY
不知道不建议
您决定为某些人挂起Windows! (或至少tormoznet疯狂)
那个城市会这么说
而T <Time do application.processmessages;
+ T <>时间 - 它可能无法正常工作,程序只会挂起
2kioto
有这样一个功能 - 称为睡眠
我认为不可能提醒您退款可能会在以后发生
例如,如果您有一个挂起更高优先级的线程
(这不仅关系到这个决定)



Странный Прохожий   (2002-07-13 20:30) [6]

准确度+ -1ms不起作用。

延迟时间是10ms的倍数(Windows 95 - 50ms)。 加上一个随机组件。

使用Sleep()时^^^。


要获得更高的分辨率,您需要一个生成中断和驱动程序的映射。



Anatoly Podgoretsky   (2002-07-13 21:10) [7]

奇怪的过客©(13.07.02 20:30)
在3级别,没有什么可以帮助,有优先级,有阻塞操作,假设有一个精度为1 ms的计时器,加上一个系统从0加到几秒,例如,下载一个坏的SD



Странный Прохожий   (2002-07-14 00:47) [8]

>阿纳托利Podgoretsky

那么我也不要争论:o)




BAY   (2002-07-14 20:17) [9]

>质子
>不知道,不建议
事实上,我不知道如何乱扔垃圾,但我写了这个答案开始讨论 - 我也很感兴趣
> T <>时间 - 它可能不起作用,程序只会挂起
这是一个拼写错误,另一个选项是:T>时间,但它被删除了



Nimbus   (2002-07-16 15:01) [10]

但我在网站上挖了什么
http://www.interface.ru/

在我看来,它可以帮助你的麻烦,Kioto!

确切的报价:

在许多实际上重要的应用领域(开发游戏时,在用于控制外部设备的实时系统等中),ms的55间隔可能变得太长。 现代PC具有多媒体计时器,其响应周期可以是1 ms或更高,但是该计时器没有组件实施例,因此,为了访问它,必须使用API​​功能。

其使用的一般方案如下。 首先,准备一个回调程序,标题为:


过程TimeProc(uID,uMsg:UINT; dwUser,dw1,dw2:DWORD); STDCALL;

这里uID是计时器事件标识符(见下文); uMsg - 未使用; dwUser是触发定时器时传递给过程的任意数字; dw1,dw2 - 未使用。

定时器启动由以下功能实现:


function timeSetEvent(uDelay,uResolution:UINT; lpTimeProc:Pointer; dwUser:DWORD; fuEvent:UINT):UINT; STDCALL; 外部“winmm.dll”;

这里uDelay是定时器所需的时间周期(以ms为单位); uResolution - 定时器分辨率(0值表示定时器触发事件​​将尽可能频繁发生;为了减少系统负载,可以增加此值); lpTimeProc - 回调过程的地址; dwUser是一个传递给回调程序的任意数字,程序员可以自行处理; fuEvent - 控制定时器事件频率的参数:TIME_ONESHOT(0) - 事件在uDelay毫秒内只发生一次; TIME_PERIODIC(1) - 每个uDelay ms周期性地发生事件。 如果成功,则该函数返回计时器事件标识符,如果调用错误则返回0。

计时器停止,相关的系统资源由函数释放:


function timeKillEvent(uID:UINT):UINT; STDCALL; 外部“winmm.dll”;

这里uID是timeSetEvent获取的计时器事件标识符。

以下示例(Timer.dpr)说明了多媒体计时器的使用。



unit Unit1;

接口

使用
Windows,消息,SysUtils,类,图形,控件,表单,
Dialogs,StdCtrls,Buttons,ExtCtrls;

类型
TfmExample = class(TForm)
Panel1:TPanel;
bbRun:TBitBtn;
bbClos​​e:TBitBtn;
edInput:TEdit;
lbOutput:TLabel;
mm输出:TMemo;
程序bbRunClick(发件人:TObject);
procedure FormActivate(Sender:TObject);
私立
{私人声明}
公开
{公开声明}
结束;

VAR
fm例如:TfmExample;

履行

{$ R * .DFM}
//导出函数声明:

function timeSetEvent(uDelay,uReolution:UINT; lpTimeProc:Pointer;
dwUser:DWORD; fuEvent:UINT):整数; STDCALL; 外在的“winmm”;

function timeKillEvent(uID:UINT):整数; STDCALL; 外在的“winmm”;

//声明全局变量
VAR
uEventID:UINT; //计时器事件ID
BegTime:TDateTime; //我们注意时间<
专柜:整数; //重复计数
延迟:字; //响应期

proc ProcTime(uID,msg:UINT; dwUse,dw1,dw2:DWORD); STDCALL;
//对定时器操作的反应(回调程序)
VAR
h,m,s,ms:Word; //用于解码时间的变量
常量
MaxCount = 55; //重复次数
开始
timeKillEvent(uEventID); //停止计时器
计数器:=计数器+ 1; //增加计数器
如果Counter = MaxCount则//循环结束?
开始// - 是:解码时间
DecodeTime((Time-BegTime)/ MaxCount,h,m,s,ms);
fmExample.mmOutput.Lines.Add(//报告结果
格式(“设置%s ms。收到%d ms”,
[fmExample.edInput.Text,ms]));
fmExample.edInput.Text:=“”; //烹饪重复
fmExample.edInput.SetFocus
结束否则// - 否:让计时器再次运行
uEventID:= timeSetEvent(Delay,0,@ ProcTime,0,1);
结束;

procedure TfmExample.bbRunClick(Sender:TObject);
//启动计时器。 edInput包含所需的时间段。
开始
//检查周期设置
if edInput.Text =“”然后退出;
尝试
延迟:= StrToInt(edInput.Text)

ShowMessage(“输入数字时出错”);
edInput.SelectAll;
edInput.SetFocus;
出口
结束;
计数器:= 0; //重置计数器
BegTime:=时间; //我们注意时间
//启动计时器:
uEventID:= timeSetEvent(Delay,0,@ ProcTime,0,1);
如果uEventID = 0那么
ShowMessage(“启动计时器错误”)
结束;

procedure TfmExample.FormActivate(Sender:TObject);
开始
edInput.SetFocus
结束;

结束。





Страницы: 1 整个分支

论坛:“主要”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

楼上









内存:0.61 MB
时间:0.028 c
1-95342
天空步行者
2002-07-17 13:08
2002.07.29
B ++有继承的类比吗?


1-95367
安德鲁斯
2002-07-15 19:22
2002.07.29
如何将您的应用程序调整到不同的设置


1-95382
Fissher
2002-07-15 20:09
2002.07.29
我再次使用我的ComboBox!


14-95490
离子T
2002-07-01 02:03
2002.07.29
正则表达式


1-95409

2002-07-16 10:51
2002.07.29
形式





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский