Avatar billede sabine Nybegynder
21. juni 2000 - 18:58 Der er 10 kommentarer og
1 løsning

Delay i microsekunder

er der nogen der ved hvordan man laver et delay i microsekunder

Avatar billede baunsgaard Nybegynder
21. juni 2000 - 19:21 #1
Benyt Sleep
Avatar billede borrisholt Novice
21. juni 2000 - 19:36 #2
Sleep operer kun i millisekunder

Jens B
Avatar billede baunsgaard Nybegynder
21. juni 2000 - 19:52 #3
sorry!
Avatar billede borrisholt Novice
21. juni 2000 - 19:56 #4
Hmmmn ... Prøv at kigge på funktionen QueryPerformanceFrequency() Hvis du ved hvor mange slag den slår i sekundet må du kunne regne dig frem til resten ..

Jens b
Avatar billede borrisholt Novice
21. juni 2000 - 20:24 #5
Så hold dig for ørene for nu kommer noget grim kode ....

Det her skulle kunne løse dit problem ..... Koden til min knap er selvfølgelig bare en lille test ....

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{$IFDEF VER120}
    {$DEFINE Delphi4or5}
{$ENDIF}

{$IFDEF VER130}
    {$DEFINE Delphi4or5}
{$ENDIF}

  {$IFDEF Delphi4or5}
    type
      TLargeInteger = _LARGE_INTEGER;
  {$ENDIF}

Function GetTicksPerSecond(ITERATIONS:Word):Comp;
Var
  FREQ,PERFCOUNT,TARGET:TLARGEINTEGER;
begin
  result := 0;
  {$IFDEF Delphi4or5}
    if NOT QueryPerformanceFrequency(int64(FREQ)) then exit;
  {$ELSE}
    if NOT QueryPerformanceFrequency(FREQ) then exit;
  {$ENDIF}

  TARGET.QuadPart:=PERFCOUNT.QuadPart + (FREQ.QuadPart * ITERATIONS);
  Result := trunc((TARGET.QuadPart - PERFCOUNT.QuadPart) / ITERATIONS);
end;

var
  PulsePerMicroSecond : Integer = 0;

Procedure InitCounter;
begin
  PulsePerMicroSecond := Round(GetTicksPerSecond(10)/10000);
end;

procedure Newsleep(MicroSeconds : Integer);
Var
  PERFCOUNT, TARGET : TLARGEINTEGER;
  Stop : {$IFDEF Delphi4or5}Int64{$ELSE}Comp{$ENDIF};
begin
  {$IFDEF Delphi4or5}
    QueryPerformanceCounter(int64(PERFCOUNT));
  {$ELSE}
    QueryPerformanceCounter(PERFCOUNT);
  {$ENDIF}

  Stop := PERFCOUNT.QuadPart + MicroSeconds * PulsePerMicroSecond;
  repeat
    {$IFDEF Delphi4or5}
      QueryPerformanceCounter(int64(TARGET));
    {$ELSE}
      QueryPerformanceCounter(TARGET);
    {$ENDIF}
  until TARGET.QuadPart >= Stop;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := TimetoStr(Now);
Newsleep(10000);
ShowMessage(TimetoStr(Now));
end;

initialization
  InitCounter;
end.
Avatar billede baunsgaard Nybegynder
21. juni 2000 - 20:28 #6
borrisholt>> Cool - et delay, der bruger 100% CPU :-)
Avatar billede borrisholt Novice
21. juni 2000 - 20:31 #7
Det er jeg fulstendig klar over, men da vi taler millisekunder betyder det ikke noget, og any way, med den tids hortsont, kan man ikke overlade CPU'en til andre ....

Jens B
Avatar billede borrisholt Novice
21. juni 2000 - 20:32 #8
Øøøh ja microsekunde selvfølgelig ...

Jens B
Avatar billede baunsgaard Nybegynder
21. juni 2000 - 20:58 #9
Hvad er pointen med at købe en GHz computer, hvis den bare står og brænder CPU af? Eller måske er det netop formålet - den venter mere nøjagtigt *s*

I øvrigt er du vel ikke herre over om CPU overlades til andre i en preemptive operativsystem... Jeg formoder at det er derfor operativsystemet ikke direkte giver mulighed for at schedule en thread i microsekunder, men kun i millesekunder!
Avatar billede borrisholt Novice
21. juni 2000 - 21:16 #10
baunsgaard > hvad man skal bruge en Delay funktion til ved jeg ikke det må sprtere under sabine. Spørg evt. ham. Jeg løste bare problemet.

Det med om du er herre over CPU'en eller ej har du kun delvist rigtigt fat i ... Man kunne evt inføje et Application.ProcessMessages() i sit loop eller kalde en Sleep(0) begge dele vil overlade CPU'en til andre der måtte stå i kø. Me du har ret jeg kan ikke bare sådan lige tage CPU'en og holde den.....

Det ovenstående kode var bare den eneste måde jeg kunne komme i tanke om implementere et så kort delay ....

Du er selvfølgelig velkommen til at byde på det etenlige spørgsmål ... Så kan vi tage diskutionen om System arkiktektur en anden god gang :o) Eller hvad ? Lad os dog ikke på denne skønne solbeskinnede dag, hvor foråret rigtigt er kommet, diskutere noget så ligegyldigt !

Jens B
Avatar billede sabine Nybegynder
22. juni 2000 - 22:00 #11
borrisholt > tak for dit hurtige svar

baunsgaard >
det jeg skal bruge et delay i microsekunder til er at jeg er igang
med at lave en E / E2prom brænder og der har i fleste kredse en brænd  puls på 50 - 100 microsekunder. Jeg kunne selvfølgelig godt bruge et delay i millisekunder
men når man skal brænde en eporm på 512K så tager det bare for langt til

Mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester