Toon posts:

[Delphi]time functie die aantal seconden geeft

Pagina: 1
Acties:
  • 107 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb in een programma een bepaalde lus nodig die maximaal zoveel seconden blijft wachten.

Dus voordat ik aan die lus begin, krijgt een variabele een bepaalde starttijd

Vervolgens controleer steeds in die lus of de actuele tijd groter is dan de wachttijd + begintijd.

Volgens mij is er een functie die aangeeft hoeveel seconden windows al gestart is. Wat is die functie? Die kan ik er namelijk goed voor gebruiken.

(Ik moet eigenlijk kunnen controleren of honderdste van een seconde.)

Verwijderd

Kijk eens naar TDateTime.

Met de functie now() kan je de lokale tijd vragen op 1/1000 van een seconde nauwkeurig.

Door slim gebruik te maken van FormatDateTime() kom je denk ik wel een stuk verder.

Verwijderd

Topicstarter
Ik heb het inmiddels al gevonden.

Het was de API GetTickcount

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 17-09 21:46

Creepy

Tactical Espionage Splatterer

Of wat dacht je van sleep() :z ?
code:
1
sleep(2000); // doe 2 secs niks

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Maar Sleep kan je niet als voorwaarde in een lus gebruiken, en dat is volgens mij wel wat de bedoeling is

:z

  • 9900578Heck
  • Registratie: Juli 2001
  • Laatst online: 21-07 09:24
GetTickCount geeft het aantal milliseconden sinds het starten van windows weer. dit is maar een nauwkeurigheid van 55 ms.

op dr. Bob's staat:
The GetTickCount API gives us the number of milliseconds since Windows was started. The accuracy of this API, however, is only 55 ms, as it is updated 18.2 times each second (just like the real mode system clock). Hence, we should use GetTickCount only for very rough measurements.

Verwijderd

dr bob is wrong, naja half wrong, 55ms op win 9x systemen, 10ms op NT single CPU systemen, en 15ms op SMP NT systemen.

QueryPerformanceCounter is een aanrader voor als je iets nauwkeuriger wil timen dan dan 10+ ms..

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 17-09 21:46

Creepy

Tactical Espionage Splatterer

Op dinsdag 16 oktober 2001 16:30 schreef delighteddennis het volgende:
Maar Sleep kan je niet als voorwaarde in een lus gebruiken, en dat is volgens mij wel wat de bedoeling is

:z
Als je alleen die timer var in de lus checkt, kan je net zo goed sleep gebruiken (ok.. sleep heeft een lage prioriteit.. dus het kan wel eens een paar miliseconden extra duren)

Als je meerdere dingen wilt checken in de lus, dan moet je idd wat anders gebruiken ja

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Sleep is geen mogelijkheid, omdat het programma nog wel andere taken moet doen.

Ik moet controleren of er een nieuw character binnen komt via de RS232 poort, maar ik heb tevens te maken met een bepaalde Time-Out.

Daarvoor gebruik ik GetTickCount en de nauwkeurigheid is hiervoor wel goed genoeg denk ik.

  • 9900578Heck
  • Registratie: Juli 2001
  • Laatst online: 21-07 09:24
Sleep moet je nooit gebruiken!
als je in de dlephi help kijkt, zul je zien dat sleep een functie is van de indy componenten.

  • yodax
  • Registratie: Januari 2000
  • Laatst online: 28-04 08:47
Je kan WaitForSingleObject gebruiken met een timer die je zelf kan afchecken.

Check de help voor WaitForSingleObject, hier staat ook hoe je een handle voor die timer kan krijgen en hoe hij ingesteld moet worden.

Verwijderd

Op dinsdag 16 oktober 2001 19:09 schreef 9900578Heck het volgende:
Sleep moet je nooit gebruiken!
als je in de dlephi help kijkt, zul je zien dat sleep een functie is van de indy componenten.
Huh???????
't Is een normale Windows API call, hoor.

Uit de help:
The Sleep function suspends the execution of the current thread for a specified interval.

VOID Sleep(
DWORD dwMilliseconds // sleep time in milliseconds
);
(Delphi 5 systeem waarop Indy niet geinstalleerd is.)

Maar omdat Indy nogal thread-georienteerd is, en die standaard Sleep call nogal tricky is binnen threads (diezelfde help adviseert in dat geval MsgWaitForMultipleObjects of MsgWaitForMultipleObjectsEx), neem ik aan dat ze bij Indy een eigen Sleep hebben geintroduceerd.

  • 9900578Heck
  • Registratie: Juli 2001
  • Laatst online: 21-07 09:24
inderdaad grappig,

als ik in de help kijk staat sleep gedeclareerd in idGlobal, hetgeen een unit is die bij indy hoort. maar daarin staat bijvoorbeeld ook TThreadPriority gedeclareerd, hetgeen echt niet indy specififc is.
dat was dus de reden dat ik aannam dat het een indy functie was.

hier is de help:
Sleep
Unit: IdGlobal
=================================
Suspends the current thread for the specified number of milliseconds.


procedure Sleep(ATime: cardinal);

Parameters

ATime: cardinal

The number of milliseconds to sleep.


Description

Sleep is a procedure used to suspend the current thread of execution for the number of milliseconds specified in ATime. While the current thread is suspended, control passes to other processes with an equal or higher priority.
Sleep encapsulates the platform-specific procedures or functions used to suspend the current thread of execution. For the Windows platform, the procedure used is Windows.Sleep. On the Linux platform, Sleep tries to select a non-existent socket handle for the specified number of milliseconds.

  • EWS99
  • Registratie: Maart 2001
  • Laatst online: 07:05
zo pak ik het altijd aan, misschien heb je er wat aan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var timerstart:integer;
procedure settimer;
  var lt:TSystemTime;
 begin
  GetLocalTime(lt);
  Timerstart:=  lt.wHour*3600*1000+lt.wMinute*60000+lt.wSecond*1000+lt.wMilliseconds;
  end;

function gettimer:integer;
  var lt:TSystemTime;
 begin
  GetLocalTime(lt);
  Gettimer:=lt.wHour*3600*1000+lt.wMinute*60000+lt.wSecond*1000+lt.wMilliseconds-timerstart;
  end;

Als je wilt beginnen met time-en, roep je settimer op.
Gettimer stelt dan het aantal ms voor, dat voor het laatst settimer is opgeroepen.

suc6

Hier had uw advertentie kunnen staan!

Pagina: 1