Forum Index
HomeZBasic Home   Forum RulesForum Rules   Forum FAQForum FAQ   MemberlistMemberlist   UsergroupsUsergroups   RSS FeedRSS Feed
Site SearchSite Search   LinksLinks   DownloadDownload   Digests and SubscriptionsDigests and Subscriptions
ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in   RegisterRegister
demo of sleep() for 1 sec excluding application loop time

 
Post new topic   Reply to topic    Forum Index -> Files
Author Message
stevech



Joined: 23 Feb 2006
Posts: 656

Posted: 11 August 2006, 3:14 AM    Post subject: demo of sleep() for 1 sec excluding application loop time Reply with quote

This program prints the current time as
hh:mm:ss.s fractions of second

based on the the VM's RTC

it then sleeps for the remainder of one second.

That is, it sleeps for 1 second minus the time to compute and output to a queue the time string.

the sleep() function is used with some math to compute how long to sleep.

Simple but possibly useful example.

there's also an LED blinker: red/green/both, brief flashes once/sec



sleepLessOverhead.bas
 Description:

Download
 Filename:  sleepLessOverhead.bas
 Filesize:  1.46 KB
 Downloaded:  3487 Time(s)


sleepLessOverhead.pjt
 Description:

Download
 Filename:  sleepLessOverhead.pjt
 Filesize:  23 Bytes
 Downloaded:  3126 Time(s)

Back to top
dkinzer
Site Admin


Joined: 03 Sep 2005
Posts: 2493
Location: Portland, OR

Posted: 11 August 2006, 4:07 AM    Post subject: Reply with quote

That is a nice example. A couple of items to note:
1) The RTC tick frequency is available as an UnsignedInteger value Register.RTCTickFrequency. The value is returned by the VM at run time so that if future ZX models have a different RTC tick frequency your code will automatically adapt.

2) Another way to accomplish the same goal of equal interval execution is to use WaitForInterval(). A modified version of your code (omitting the unchanged parts) is shown below.
Code:
Private intervalTaskStack(1 to 60) as Byte

sub main()
   Calltask blinkLED1, blinkled1stack
   CallTask IntervalTask, IntervalTaskStack
   Do
   Loop
end sub

Sub IntervalTask()
   Call SetInterval(1.0)  ' set a 1 second interval
   Do
      Dim h as Byte, m as Byte
      Dim sec as Single
      Dim s as string

      WaitForInterval(0)
      Call GetTime(h, m, sec)
      ' make string like 00:00:00.0  time
      s=byteToAscii2(h) & ":" & byteToAscii2(m) & ":" & _
      byteToAscii2(cbyte(sec)) & "." & byteToAscii2(cbyte(100.0 * fraction(sec)))
      console.writeline(s)
   Loop
End Sub
Back to top
stevech



Joined: 23 Feb 2006
Posts: 656

Posted: 11 August 2006, 4:44 AM    Post subject: Reply with quote

Thanks for the kind words.
I (finally, as a noobie) interpreted SetInterval() and WaitForInterval() to say that the interval timer is global to all tasks, i.e., there is not a per-task interval counter. So my thinking in my code was to wait for the remainder of the time slot (one second in my example) to expire without a shared-use interval timer amongst all tasks. But I can see other situations where SetInterval as a global timer would be useful.

A nit pick: I might suggest taking a crack at rewording and clarifying the second paragraph if WaitForInterval() - it's kinda obtuse to me. I read these several times thinking the interval timer was per-task, since that's what I'm kind of used to in other OSes.
Back to top
Display posts from previous:   
Post new topic   Reply to topic    Forum Index -> Files Time synchro. with the server - Timezone/DST with your computer
Page 1 of 1

 


All content Copyright © 2005-2012 Elba Corp. All Rights Reserved.
Opinions expressed in posts are those of the author and not necessarily those of Elba Corp.
Powered by phpBB © 2001, 2005 phpBB Group