Opóźnienie w Delphi

0

Jak zrobić (czy jest to w ogóle możliwe) opóźnienie mniejsze niż 1 ms ?

0

Może jest możliwe,ale to chyba już w assemblerze trzeba by robić wstawki...

0

mozna, bylo juz i bez asm sie spokojnie obchodzi

0

Znalazłem na forum wstawki z asemblera, ale bez asemblera nie ma nic. Może jest jakaś inna komenda <ort>oprucz </ort>sleep(1).
Może wie ktoś jaki jest czas wykonania jednej operacji przez program ?
albo np. ile czasu będzie wykonywała się taka pętla

suma:=0;
for i:=0 to 9 do
suma:=suma+1;

0

W FAQ szukaj, są dwa fajne sposoby.

0
Sleep(1 div 2)
Sleep(1 div 10)

...itd

// [rotfl] [rotfl] [rotfl] - Ł

0
procedure wait(opoznienie: real);
var
  Frequency, C1, C2, Dfr: Int64;
  czas: extended;
begin
  QueryPerformanceFrequency(Frequency);
  QueryPerformanceCounter(C1);
  repeat
    QueryPerformanceCounter(C2);
    Dfr:=C2-C1;
    czas:= dfr/Frequency;
  until czas > opoznienie;

opoznienie(0.0001); daje opoznienie 0,1ms

0
Opi napisał(a)
Sleep(1 div 2)
Sleep(1 div 10)

// [rotfl] [rotfl] [rotfl] - Ł

Właśnie o to mi chodziło. Wielkie dzięki !!!

0
Liu_Kang napisał(a)

albo np. ile czasu będzie wykonywała się taka pętla

suma:=0;
for i:=0 to 9 do
suma:=suma+1;

[rotfl] [rotfl] [rotfl] [rotfl] [rotfl] [rotfl]

oj no to predkosc bedzie bardzo zroznicowana

Liu_Kang napisał(a)
Opi napisał(a)
Sleep(1 div 2)
Sleep(1 div 10)

// [rotfl] [rotfl] [rotfl] - Ł

Właśnie o to mi chodziło. Wielkie dzięki !!!

se jaja koles robisz?? 1 div 2 = 1 div 10 = 0 bo ani 2 ani 10 nie miesci sie w 1 ani razu

0
Liu_Kang napisał(a)

np. ile czasu będzie wykonywała się taka pętla
suma:=0;
for i:=0 to 9 do
suma:=suma+1;

Najszybciej to będzie suma := 10 ;P

0

Ładny hardkor :D :D :D :D :D :D :D :D :D :D
Liu_Kang i Opi ROOOOX [rotfl] [rotfl]

0

Sądziłem że to może pomóc.... kiedyś widziałem taką odpowiedź, więc teraz sam się podzieliłem tym co widziałem ;)

Trudno, mój błąd... [sciana]

// po to masz głowę, żeby nie podchodzić bezkrytycznie do cudzych głupot. poza tym pokaż wątek z taka odpowiedzią, to go zaraz wyczyszczę - Ł

// nie pamiętam i też nie znalazłem... - Opi

0

W asemblerze na cyklach procesora:

mov cx, 3 {Ilość cykli procesora bez 1}
rep mov ax, 1 {Wykonujemy cx razy instrukcję mov ax, 1 która zajmuje 1 cykl procesora}

Możemy sobie napisać procedurę:

procedure pcDelay(cykle: Word);
begin
asm
 mov ax, cykle { Załaduj liczbę cykli do rejestru AX }
 sub ax, 3     { Odejmij od AX 3 (bo 3 operacje - 3 cykle są wykonywane }
               { przed właściwym delayem                                }
 mov cx, ax    { Załaduj AX do CX (CX jest licznikiem) }
 rep mov ax, 1 { Powtórz CX razy instrukcję zajmującą 1 cykl procesora }
               { czyli instrukcję mov ax, 1                            }
end;
end;

// krócej będzie mov cx,cykle / @@1: loop @@1 - Ł

0
adiblol napisał(a)

[...]

Nie badz taki dokladny, a call, a ret, a wrzucenie parametrow na stos/rejestrow (delphi domyslnie w rejestrach przekazuje)?

0
Wolverine napisał(a)
adiblol napisał(a)

[...]

Nie badz taki dokladny, a call, a ret, a wrzucenie parametrow na stos/rejestrow (delphi domyslnie w rejestrach przekazuje)?

Przepraszam, wiem tylko jak w Pascalu ASM działa. Myślałem, że w Delphi też tak samo z tą samą prostotą. Ale jeśli chcesz sprawić przyjemność Liu_Kangowi, to możesz policzyć ile cykli zajmują te dodatkowe operacje ;).

0
CyberKid napisał(a)

se jaja koles robisz?? 1 div 2 = 1 div 10 = 0 bo ani 2 ani 10 nie miesci sie w 1 ani razu
</quote></quote>

Nie wiem czy jaj se robie, czy ktoś inny, ale u mnie sleep (1 div 2) działa. Nie wiem dlaczego ale działa [green] .

berl napisał(a)

W FAQ szukaj, są dwa fajne sposoby.

Poszukałem i znalazłem kilka programików, które zmodyfikowałem do moich potrzeb i otrzymałem program który liczy czas wykonywania pętli. Okazuje się, że na procesorze P4 3,2GHz czas wykonywania jednego taktu (bez żadnych opóźnień) wynosi 370 - 400 ns. Myślę, że to jest najkrótrzy do osiągnięcia czas przy tej częstotliwości procesora. (jak do moich potrzeb za krótki)

Po wstawieniu opóźnienia sleep(1) czas wykonania petli wynosi od 1,1 ms do 9 ms w zależności od obciążenia proca. (jak do moich potrzeb za długi)
W momencie gdy wstawiam sleep(1 div 2) czas wykonania petli wynosi od 1,1 us do 3,5 us, a jak dla mnie ten czas jest w pełni satysfakcjonujący. Przy sleep(1 div 10) miałem podobne rezultaty, co przy div 2 (około 2us), tak samo zresztą się działo przy div 3, div 4 itd. Także Opi ma rację, może nie do końca ale jest ok.

Jeżeli ktoś nie wierzy, to tu jest programik którym testowałem opóźnienia.



unit Unit1;

interface

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

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

var
  Form1: TForm1;
  Freq, TimeStart, TimeEnd : Int64;
  i, a, suma: integer;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

//pobranie częstotliwości zegara
//sprawdzenie czy jest on dostepny (wynik funkcji musi być=True)
  if QueryPerformanceFrequency(Freq) then
      begin
        QueryPerformanceCounter(TimeStart); //start testowania

        for i:=1 to 1 do

        begin
         //sleep(1);
         // sleep(1 div 2);

       end;

        QueryPerformanceCounter(TimeEnd); //koniec testowania
        a:=(TimeEnd-TimeStart);

      end;

    Label2.Caption:='Częstotliwosc procesora '+
          FloatToStr(Freq/1000000000)+' GHz';
    Label3.Caption := 'Czas wykonania pętli '+
          FloatToStr(a/Freq*1000000)+' us';

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    Label1.Caption := 'Program pokazuje częstotliwosc procesora i czas wykonania pętli';
end;

end.
0

sleep(1) to chyba wiadomo, a pozostałe przypadki to po prostu sleep(0), które też zajmuje pewien czas (trzeba funkcję wywołać i wykonać). 1 div 2 = 1 div 10 = 1 div cokolwiek większe od jedynki = 0. tak więc nie chrzanić mi tu, że 1 div 2 da większe opóźnienie niż 1 div 10, bo bany rozdam. [diabel]

tak poza tym http://www.google.com/url?sa=U&start=6&q=http://www.mkssoftware.com/docs/man3/usleep.3.asp&e=10342 - tylko trochę się zdziwiłem, że na platformie NT też jest funkcja usleep().

0
ŁF napisał(a)

sleep(0), które też zajmuje pewien czas (trzeba funkcję wywołać i wykonać

Dodatkowo wywołanie Sleep(0) zwiększa element "losowości" - przez to wątek zostanie prawie na pewno wywłaszczony na rzecz wątku o podobnym lub wyższym priorytecie.
Marooned: Co do tego linku - chyba Kojot ma problemy z AutoUrl :)

//a czemu to do mnie piszesz? :) - M

1 użytkowników online, w tym zalogowanych: 0, gości: 1