首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

关于timer控件中运用sleep函数的时间有关问题,

2013-10-22 
关于timer控件中运用sleep函数的时间问题,急!如果timer控件的interval属性设置为200,program1-3代表要处理

关于timer控件中运用sleep函数的时间问题,急!
如果timer控件的interval属性设置为200,program1-3代表要处理的事情

Private Sub Timer1_Timer()
    program1
    program2
    Sleep (1000)
    program3
End Sub

请问程序会不会执行program3,因为200<1000,程序会不会200毫秒后又重新执行Timer1_Timer过程,不明白interval属性和sleep函数所设置的时间会不会有冲突。
[解决办法]

引用:
Timer控件是不是不管其Timer1_Timer过程中的代码执行需要多少时间,都会执行完其过程任务(代码)再执行下一次Timer过程


对,所以有些需要比较均匀间隔时间执行的操作,就要避免在Timer1_Timer过程中做耗时的操作。
[解决办法]
即使下一次 Timer 计时完成,当前 Timer 事件中的代码依然会继续执行,而下一次的触发会“挂起”,等待当前事件完成后,再重新进入。

所谓“挂起”,是系统在应用缓存中保存事件信息来完成的。

所以,这样的代码的最终结果,是因“内存耗尽”而死机。
[解决办法]
Private Sub Timer1_Timer()
    program1
    program2
    Sleep (1000)
    DoEvents
    program3
End Sub
但是这样写,就会堆栈溢出,并且program3永远不会执行。
[解决办法]
1、mscomm控件的settings属性中的传输速率指的是由发送缓冲区发送数据到接受缓冲区的速率还是指其他;

是传输线上的传输速率,一般也称波特率,即每秒种传输的比特数。这一设置主要是为了使接收端能够适时采样。

2、OutBufferSize和InBufferSise的属性值又指什么?如果OutBufferSize=512,InBufferSise=1024,是不是当发送缓冲区(OutBufferSize)中的数据为512字节时才往接收缓冲区(InBufferSise)发送数据,少于512字节不发送,必须等收集到512字节后才往接收缓冲区发送数据;接收缓冲区也要等接收够1024个字节才读取数据?

不是,仅仅是应用可以使用的缓存大小而已。

这两个设置主要是为了协调应用代码运行和数据发送二者的关系。

由于串口是低速通讯接口,其传输速度远低于代码运行速度。如果输出缓冲区很小(极端情况只有 1 字节),则应用在发送较多数据时就要等待发送完成,影响效率。因此输出缓存的大小与以下需求或协议规定有关:

1 在一个事务中,一次发送的最大数据量;

2 如果一次发送的数据量很大,要考虑代码运行和数据传输之间的时间比例,以及应用对代码运行效率的要求。

输入缓冲区是为了方便应用在没有来得及读取接收到的数据时,不会出现 Overrun (即丢失数据)的情况。它的大小设置也要考虑应用的情况。

另外,发送和接收都不会等待缓存满。

有一点要说明,输出缓冲区所缓存的数据经由硬件接口的 TXD 线发送到串口电缆所连接的接收方;而输入缓冲区是保存了硬件接口从 RXD 线所接收的对方发送的数据。同一端的输出/输入缓冲区之间并不直接发生关系。

有些童鞋没有理解的是,实际上,发送和接收,都是硬件来完成的。应用代码所做的,只不过是把要发送的数据放到“发货站”;把接收到的数据从“收货站”提货。缓存,就是这些货站。
[解决办法]
Sleep是挂起进程,楼主如此写法是不对的。
[解决办法]
我也觉得楼主的使用方法可能有点问题。
[解决办法]
不应该用Sleep;而应该在Timer事件中累加并检查比如一个全局整型变量计数器,到达指定值时再调用 program3
[解决办法]
引用:
不应该用Sleep;而应该在Timer事件中累加并检查比如一个全局整型变量计数器,到达指定值时再调用 program3

我觉得也是。
一般需要“等待较长时间”,就用时间计数器。
如果要“等待另一事件的完成”,就用标志变量和步骤指示分支。

热点排行