Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Timer und Rechner-Belastung? (https://www.delphipraxis.net/5791-timer-und-rechner-belastung.html)

Minz 19. Jun 2003 14:05


Timer und Rechner-Belastung?
 
Hallo,

wie sieht es eigentlich bei der Verwendung von Timern aus?

Beansprucht das viel Rechenleistung bzw. Bearbeitungszeit?

Gruß Minz

Daniel B 19. Jun 2003 14:14

Hallo,

der Timer hat im System die niedrigste Priorität. Dürfte kaum auffalen wenn Du welche benutzt. ;)

Grüsse, Daniel :hi:

flomei 19. Jun 2003 21:24

Zitat:

Zitat von Daniel B
der Timer hat im System die niedrigste Priorität. Dürfte kaum auffalen wenn Du welche benutzt. ;)

In einigen Komponentensammlungen (z.B.: TMS Instrumentation Workshop) gibt es Timer bei denen man die Priorität einstellen kann. Kann mir irgendwer bestätigen, dass so etwas funktioniert? Würd mich interessieren.

MfG Florian :hi:

chris01 19. Jun 2003 21:34

Ich habe aber mal gelesen, dass wenn man mehr als 7 Timer gleichzeitig Windows 'hängen' bleibt!! Habe ich noch nie ausprobiert!! Brauche meistens mir nur einen!!

Bye chris01

flomei 19. Jun 2003 21:40

:twisted: Wir töten es mit kleinen Stoppuhren... Wer hat gesagt, dass man Knoblauch braucht? :twisted:

:lol: Ich probier das irgendwann mal aus :coder: Aber im Moment hab ich was zu tun und keine Lust den Rechner zu crashen... :|

MfG Florian :hi:

Daniel B 19. Jun 2003 22:57

Hallo,

also die Anzahl der Timer dürfte wohl nicht entscheidend sein, wohl eher das was da drin passiert. 20 Timer die alle 100ms eine Message bringen, sind kein Thema. Unter Win2000 geht das ohne Probleme und ich meine das auch bei den "niederen" Betriebssystemen das auch kein Thema ist. ;)

Grüsse, Daniel :hi:

Minz 22. Jun 2003 00:37

Hallo,

vielen Dank erstmal für die Beiträge...

Wie siehts denn mit ähm mehreren 100.000 Timern aus,

deren Intervall Zufällig eingestellt wird? :roll: :mrgreen:

Grüßerle Minz

P.S.: Die Frage war ernstgemeint! :D

Christian Seehase 22. Jun 2003 02:05

Moin Minz,

ich hab' mal 10000 Timer dynamisch erzeugen lassen (Interval := Random(1000)+20), denen das gleiche OnTimer Event zugeordnet und in diesem Event den Namen des gerade aufrufenden Timers in ein Memo geschrieben.

Das gab dann so, wahrscheinlich wegen des Memos so 60% CPU Last.
(Duron 700 / 768MB)

Du kannst das ja mal mit dem was bei Dir beim OnTimer passieren soll selber probieren.

Minz 22. Jun 2003 04:24

Hmm probiere das gerade, wie bekomme ich denn den
Sendernamen des aufrufenden Timers?

Den will ich nämlich anzeigen lassen... :?:

MadMason 22. Jun 2003 10:16

Wenn der Timer mit niedriger Priorität läuft ist dann eigentlich bei hoher Rechenlast noch die Genauigkeit garantiert?

@Minz: Den Namen kriegst du mit
Delphi-Quellcode:
Sender.Name
raus

Christian Seehase 22. Jun 2003 13:44

Moin MadMason,

Zitat:

Zitat von MadMason
ist dann eigentlich bei hoher Rechenlast noch die Genauigkeit garantiert

Genauigkeit wird bei diesen Timer sowieso nicht garantiert.

MadMason 22. Jun 2003 15:06

Zitat:

Zitat von Christian Seehase
Genauigkeit wird bei diesen Timer sowieso nicht garantiert.

Gibt es ne Timer-Kompo wo die Genauigkeit garantiert ist?

flomei 22. Jun 2003 15:31

Zitat:

Zitat von MadMason
Gibt es ne Timer-Kompo wo die Genauigkeit garantiert ist?

Garantiert dir Micro$oft das Windoof nicht irgendwann mal abstürzt? ;) Ich denke, man kann keine Garantie geben weil wenn der Rechner bockt dann bocken auch die Timer. Ist halt abhängig vom Rest.

MfG Florian :hi:

Minz 22. Jun 2003 21:57

Delphi-Quellcode:
procedure TForm1.TimerProc(Sender: TObject);
begin
        label1.Caption:=Sender.name;
end;
Da meckert er undeclared identifier: 'name'

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var    i:integer;
begin
     for i:=0 to 9999 do begin
        setlength(Timer, length(Timer)+1);
        Timer[high(Timer)]:=TTimer.create(form1);
        Timer[high(Timer)].Name:='Timer'+inttostr(high(Timer));
        Timer[high(Timer)].interval:=random(10000)+1;
        Timer[high(Timer)].OnTimer:=TimerProc;
     end;
end;
Oder liegt da irgendwo der Hase im Pfeffer begraben? Oder wars der Hund? :mrgreen:

Luckie 22. Jun 2003 22:00

Probier mal:
Delphi-Quellcode:
label1.Caption:=(Sender as TTimer).Name;

Minz 22. Jun 2003 22:12

Das klappt schonmal ...

Leider kann ich nur um die 2500 Timer erstellen...beim compilieren kommt:

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EOutOfResources with message 'Not enough timers available'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Beim ausführen der exe kommt 'Not enough Timers available'

Weiß jemand was das soll?

Ich habe die Systemresourcen anzeigen lassen mit dem Windowstool,
der zeigt noch über 80% verfügbar an.

Die CPU-Auslastung ist bis dahin aber nicht erwähnenswert.
(Athlon 1700+//256 MB RAM

)

Luckie 22. Jun 2003 22:14

Was für ein OS?

Minz 22. Jun 2003 22:28

win 98

Luckie 23. Jun 2003 08:18

Jupp. Windows98 gehen schnell mal die Ressourcen aus. Zu den Ressourcen zählen auch die verfügbaren Handles und ähnliches.

Sanchez 23. Jun 2003 08:18

Wenn ich mich nicht täusche, sind bei einer alten Delphi-Version, weiss nicht welche, nur 6 Timer möglich. Hab ich mal wo aufgeschnappt, kann ich aber nicht zu 100% sagen.

Welche Delphi-Version hast du?

mfg Daniel

Minz 23. Jun 2003 10:39

habe Delphi 6

Kann es vielleicht sein, dass Delphi von vornherein nicht
den gesamten Speicher verwendet? Also z.B. reserviert er
Speicherplatz für Objekte nur ein paar MB so wie
Stack oder Heap (oder was es da so gibt)

Deswegen konnte Christian mit 768 MB vielleicht auch
10000 Timer erzeugen. Ich habe nur 256 MB.

Diesen vorab reservierten Speicher könnte man doch dann
bestimmt erhöhen bzw. veranlassen, dass der gasamte verfügbare
Speicher verwendet wird.

Grüße Minz

Luckie 23. Jun 2003 10:46

Sag mal, liest hier eigentlich auch jemand meine Antworten? Christian hat bestimmt auch Windows2000 oder XP und da sieht das mit den Ressourcen schon wieder ganz anderes aus.

Minz 23. Jun 2003 10:52

Ja sorry, aber schwerlich zu akzeptieren, dass es aufgrund von
Win98 keine Lösung für das Problem gibt :freak:

Bei allem Respekt kannst du nicht wissen, welches Betriebssystem er damals verwendet hat (Duron700-Zeit) es sei denn er hats dir gesagt :wink: oder aber sein Duron 700 ist sein aktueller Rechner.

Aber dat geht jetzt auch am Thema vorbei.

Friede pls :angle:

Luckie 23. Jun 2003 10:58

Was heißt damals? Und ich meine zu wissen, dass er Windows2000 einsetzt.

Nur weil da Duron 700 steht heißt das noch lange nicht, dass es lange her ist, dass er das getestet hat. Es kauft sich eben nicht jeder aus reinen Profilierungsgründen alle halbe Jahr den neusten Rechner.

Sanchez 23. Jun 2003 10:59

Was soll "Duron-700 Zeit" bedeuten.
Meiner tuts halt noch.

mfg Daniel

Minz 23. Jun 2003 11:05

Ist ja gut ist ja gut, wenn du sein post gelesen hast steht da:
...Ich habe einaml...

Wenn ihr daraus macht: er hat zu dem Zeitpunkt 2000//XP verwendet
dann ok ...und kein Grund feindseelig zu werden oder
Profilierungsgründe zu erwähnen, weshalb sich jemand einen Rechner kauft, sei ihm überlassen.

Und jetzt lasst den Threat bitte nicht in ein Streitthread verwandeln,
davon gabs bei Delphi-Source genug, weshalb ich von Delphi-Praxis begeistert war, weil da alle so freundlich sind :love:

Danke Minz

Sanchez 23. Jun 2003 11:14

Das hat doch nichts mit Feindseeligkeit zu tun, wollt nur mal anbringen, dass ich noch meinem 750er Duron vertraue.

mfg Daniel

Minz 23. Jun 2003 11:15

Jo, meinte ja auch nicht dich :)

Christian Seehase 23. Jun 2003 11:47

Moin Zusammen,

nur um das mal zu klären:
Der Duron 700 ist mein aktueller Rechner, und läuft unter W2K SP2.
In manchen Fällen kann man den schönen Satz aus dem Automobilbereich (Hubraum statt Spoiler) auch auf den Computer übertragen (MB statt MHz) :mrgreen:


Was den Speicherbedarf der 10000 Timer anging:
In der Prozessliste lag das Programm mit einer Speicherbelastung von ca. 5,5 MB.

@Sanchez:
Das mit den sechs Timern kann eigentlich nicht stimmen, da man diese ja auch über die API Funktionen erzeugen kann. TTimer kapselt diese ja nur.

@Minz:
das fiese an den geringen Resourcen die Win9x zur Verfügung stehen ist ja, dass das OS selber "Speichermangel" meckert, wenn ihm die Handles ausgehen, was dann oft in der Frage mündet: "Ich hab' doch xxxMB Speicher, und sonst läuft nichts, wieso kommt die Meldung?"

Chewie 23. Jun 2003 12:01

Brauchen Timer eigentlich Handles? Eigentllich sind Timer ja nur Windows-Messages. Lediglich das TTimer-Objekt braucht Thread-Handle und -ID, da die OnTimer-Prozedur ja in einem eigenen Thread läuft. Bearbeitet man das Timer-Ereignis im Hauptthread, dürften doch keine zusätzlichen Resourcen benötigt werden, oder?

Niko 23. Jun 2003 12:37

@Minz:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Memo1: TMemo;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FTimeOffsets: array[0..1000] of Byte;
    FTimeElapsed: array[0..1000] of Byte;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
begin
  for i := Low(FTimeOffsets) to High(FTimeOffsets) do
  begin
    if FTimeElapsed[i] = FTimeOffsets[i] then
    begin
      FTimeElapsed[i] := 0;
      // irgend etwas machen:
      Memo1.Lines.Add('Virtueller Timer ' + IntToStr(i));
    end
    else
      Inc(FTimeElapsed[i]);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  Randomize;
  for i := Low(FTimeOffsets) to High(FTimeOffsets) do
    FTimeOffsets[i] := Random(256);
end;
Bei diesem Code brauchst du nur eine Timer-Komponente und kannst beliebig viele "virtuelle" Timer erzeugen, die in verschiedenen Abständen auslösen.

Minz 24. Jun 2003 01:37

Liste der Anhänge anzeigen (Anzahl: 1)
sprich ich kann das Prob nur mit nem neuen Betriebssystem umgehen? :(


verdammich aber auch...

Ob du da mal die Grenze austesten kannst? Ich schick dir gerne

auch das Programm zu, dann kannst du da direkt die Anzahl

eintippseln (direkt im Quellcode :mrgreen: )

Weil des würd ich gerne Wissen, bevor ich jetzt erst ein neues

Betriebssystem aufspiele. War sonst mit Win98 eigentlich
zufrieden.

Gruß Minz

Minz 24. Jun 2003 01:40

ah danke Niko, habs zu spät gelesen...ganz verstehen tu ich das ding

allerdings noch nicht...

werds mir nochmal anschauen...

------------

Achso, kapiert, allerdings durchläufst du dann bei jedem mal

die gesamte Liste der virtuellen Timer! Das wollte ich eigentlich

umgehen, weil ich sehr viele Timer verwenden will.

Niko 24. Jun 2003 19:47

Eine andere Möglichkeit, die virtuellen Timer mit unterschiedlichen Abständen aber regelmäßig auslösen zu lassen wüsste ich jetzt nicht...

Allerdings denke ich, dass der einfache Vergleich und das Hochzählen des Wertes auf aktuellen Rechnern auch bei 20000 oder mehr Schleifendurchläufen kein Problem darstellen sollte - und wahrscheinlich sogar ressourcenschonender ist als das Erzeugen von 20000 echten Timern.

Christian Seehase 24. Jun 2003 20:35

Moin Minz,

falls denn die Frage nicht zu indiskret wird ;-)

Wozu brauchst Du eigentlich so viele Timer?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 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