From: ryot AT bigfoot DOT com (George Ryot) Newsgroups: comp.os.msdos.djgpp Subject: Re: uclock() and Integer Message-ID: <37b3e739.5241020@news.clara.net> References: X-Newsreader: Forte Agent 1.5/32.452 X-No-Archive: yes MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Date: Thu, 12 Aug 1999 15:32:56 GMT NNTP-Posting-Host: 195.8.92.177 X-Complaints-To: abuse AT clara DOT net X-Trace: nnrp3.clara.net 934471976 195.8.92.177 (Thu, 12 Aug 1999 16:32:56 BST) NNTP-Posting-Date: Thu, 12 Aug 1999 16:32:56 BST Lines: 35 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Eli Zaretskii wrote: > Let me guess: you are running this on Windows 9X, right? > > If so, then the problem is that `uclock' reprograms the system timer when > you call it the first time, and Windows does not update the actual timer > device with the new mode until the next timer tick. So, during the first > timer tick interval after the first call to `uclock', the timer still > works in its original mode, before it was reprogrammed, and confuses the > computations inside `uclock'. > > In DJGPP v2.03, `uclock' was changed to wait until the timer ticks when > it is called for the first time. This solves the problem. As a > work-around, you can do the same in your code, like this: > > int otics; > uclock (); > _farsetsel(_dos_ds); > otics = _farnspeekl(0x46c); > do { > errno = 0; > __dpmi_yield(); /* will set errno to ENOSYS on plain DOS */ > } while (errno == 0 && _farnspeekl(0x46c) == otics); > > uclock (); The following code seems to work fine on W95 : uclock(); /* Initialise the timer */ while(clock() == 0); /* Wait for first tick */ while(!(kbhit())) /* Loop until keypress */ printf("%Ld\n", uclock()); -- george