Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Thread arbeitet schneller wenn IDE aktiv ist. Warum? (https://www.delphipraxis.net/191476-thread-arbeitet-schneller-wenn-ide-aktiv-ist-warum.html)

norwegen60 20. Jan 2017 08:11

Delphi-Version: 10 Seattle

Thread arbeitet schneller wenn IDE aktiv ist. Warum?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich habe folgenden Thread um mich etwas in die Thematik einzuarbeiten:

Delphi-Quellcode:
type
  TValues = Class
    dtTime : TDateTime;
    rForce,
    rTemperature,
    rHumidity : Real;
  End;


var
  Form1: TForm1;
  threadList1 : TThreadList;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  threadList1 := TThreadList.Create;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if (mythreadRunning = FALSE) then
  begin
    mythreadRunning:= TRUE;
    secondProcess := TMyThread.Create(True); { Create suspended--secondProcess does not run yet. }
    secondProcess.FreeOnTerminate := True; { You do not need to clean up after termination. }
    secondProcess.Priority := tpNormal; // Set the priority to lower than normal.
    secondProcess.Resume; { Now run the thread. }
  end
  else
    MessageDlg('This thread is still running. You are going to hurt yourself!',
      mtInformation, [mbOk], 0);
end;


procedure TMyThread.Execute;
var
  Values: TValues;
begin
  while(True) do
  begin
    if (Terminated) then
    begin
      mythreadRunning:= FALSE;
      exit;
    end;
    globalCount:= globalCount + 1;
    Values := TValues.Create;
    Values.dtTime := now;
    Values.rForce := globalCount;
    Values.rTemperature := globalCount/3;
    Values.rHumidity := globalCount/7;
    threadList1.Add(Values);
    Sleep(10);
  end;
  mythreadRunning:= FALSE;
end;
Das Seltsame:
  • Starte ich das Programm mit F9 in der Delphi IDE sehe ich anhand des Zeitstempels dass die Daten im 0.010 - 0.011s Intervall erzeugt werden
  • Starte ich die EXE bei laufender IDE im Explorer, werden die Daten ebenfalls im 0.010 - 0.011s Intervall erzeugt
  • Sobald ich Delphi beende erhöht sich der Intervall auf 0.015 -0.016s
  • Auch wenn ich die EXE ohne laufendes Delphi starte ist der Intervall 0.015 -0.016s
  • Dabei spielt es keine Rolle ob ich die EXE im DEBUG- oder om RELEASE-Mode erstellt habe.
  • Um sicher zu gehen, dass es nicht bei der Anzeige zu Nebeneffekte kommte, lasse ich mir die Daten erst anzeigen wenn der Erzeuger-Thead pausiert ist

Hat jemand eine Erklärung?

Danke
Gerd

Zacherl 20. Jan 2017 09:05

AW: Thread arbeitet schneller wenn IDE aktiv ist. Warum?
 
Das liegt daran, dass die IDE die Timer Resolution von Windows erhöht. Dadurch arbeitet
Delphi-Quellcode:
Sleep
bei sehr kleinen Werter genauer. Siehe auch MSDN-Library durchsuchentimeBeginPeriod.

norwegen60 20. Jan 2017 09:35

AW: Thread arbeitet schneller wenn IDE aktiv ist. Warum?
 
Habe mir die Kommentare in dem Link angeschaut und dann die SleepTime variabell gemacht.
Ergebnis:
Egal ob Sleep(1) oder Sleep(15) => Ist war 15-16 ms
ab 16 waren es dann 30-31 ms

Gibt es eine Möglichkeit die erhöhte Auflösung von Delphi beizubehalten?

jaenicke 20. Jan 2017 12:38

AW: Thread arbeitet schneller wenn IDE aktiv ist. Warum?
 
Selbst timeBeginPeriod aufrufen?

Oder gar nicht Sleep benutzen und die Zeit selbst verwalten.

norwegen60 20. Jan 2017 13:24

AW: Thread arbeitet schneller wenn IDE aktiv ist. Warum?
 
Ja, OK. Hätte noch weiter nach dem
Delphi-Quellcode:
timeBeginPeriod
schauen sollen.

t.roller 20. Jan 2017 16:36

AW: Thread arbeitet schneller wenn IDE aktiv ist. Warum?
 
Siehe ClockRes v2.1

Nach der Änderung mit ClockRes kann man es mit folgendem Code überprüfen:
Delphi-Quellcode:
program SystemTimeAdjustment;

{$APPTYPE CONSOLE}

uses
//  SysUtils, windows;
  System.SysUtils, Winapi.Windows;

  var a,b:DWORD; c:bool;

begin
  GetSystemTimeAdjustment(a,b,c);
  WriteLn('System time adjustment: '+FloatToStr(b / 10000)+' ms');
  WriteLn;
  Writeln('Press any key...');
  Readln;
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz