AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread GENAU alle 10ms ausführen

Ein Thema von Cubysoft · begonnen am 19. Aug 2015 · letzter Beitrag vom 23. Aug 2015
 
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#15

AW: Thread GENAU alle 10ms ausführen

  Alt 22. Aug 2015, 16:59
Was hast Du den während der Messung gemacht? Nix? Oder mal Datei oder Screen I/O?
Oder mal ne For-Schleife die 1 Minute läuft? Hast Du mal ein anderes Programm gestartet (Word Delphi oder so...)
Der Windows-Media-Timer wird in dieser Form vielen Multimedia-Anwendungen verwendet, z.B. beim Abspielen von Midifiles. Das sind sehr zeitkritische Anforderungen (ein Midifile darf ja nicht "leiern", Aussetzer haben oder dergleichen) wo parallel dazu noch andere Aufgaben (auch VCL) erledigt werden müssen. Mein Testprogramm war ganz einfach als VCL-Anwendung gestrickt. In der Praxis (und auch so wie vom TE gewünscht) lauft der Timer in einem eigenen Thread mit erhöhter Priorität. Ich hab mir die Arbeit für ein diesbezügliches Testprogramm jetzt nicht gemacht, aber die Abweichung liegt mit Sicherheit noch darunter, auch wenn parallel dazu andere Arbeiten erledigt werden.

Auszug, ohne Anspruch auf Vollständigkeit, eben nur mal schnell zum Testen:

Delphi-Quellcode:

implementation

uses MMSystem;

const
  MW_TIMER_TEST = WM_USER + 100;

procedure TimerCallBackProc(uTimerID, uMsg: Integer; dwUser, dwParam1, dwParam2: LongWord); stdcall;
begin
  PostThreadMessage(HWND(dwUser), MW_TIMER_TEST, 0, 0);
end;

procedure TFrmTimerTest.Start;
const
  MaxCount = 10000;
var
  TimerMsg: TMsg;
  TimerProc: TTimerProc;
  TimerInterval, TimerID, TimerCount, Counter: Integer;
  CloseRequested: boolean;
  TimerReturnMsg: Longbool;
begin
  Counter := 0;
  TimerInterval := 10;
  TimerCount := 0;
  TimerProc := TimerCallBackProc;
  TimerID := timeSetEvent(TimerInterval, TimerInterval, @TimerProc,
                          GetCurrentThreadId, TIME_PERIODIC);
  if TimerID = 0 then begin
    timeEndPeriod(TimerInterval);
    Exit;
  end;
  Memo.Lines.Clear;
  edStartTickCount.Tag := GetTickCount;
  edStartTickCount.Text := IntToStr(edStartTickCount.Tag);
  repeat
    TimerReturnMsg := GetMessage(TimerMsg, 0, 0, 0);
    Inc(Counter);
    if Counter > MaxCount then break;
    if TimerMsg.Message = MW_TIMER_TEST then
    begin
      Inc(TimerCount);
      // Anzeige, damit der VCL-Thread auch ein bisserl was zu tun hat
      Memo.Lines.Add('Count:'+IntToSTr(TimerCount));
    end;
    TranslateMessage(TimerMsg);
    DispatchMessage(TimerMsg);
  until (integer(TimerReturnMsg) <= 0);
  edStopTickCount.Tag := GetTickCount;
  edStopTickCount.Text := IntToStr(edStopTickCount.Tag);
  edDiffTickCount.Tag := edStopTickCount.Tag - edStartTickCount.Tag;
  edDiffTickCount.Text := IntToStr(edDiffTickCount.Tag);
  timeKillEvent(TimerID);
  timeEndPeriod(TimerInterval);
end;
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz