Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi syncOjs.TEvent extrem langsam (https://www.delphipraxis.net/215039-syncojs-tevent-extrem-langsam.html)

TomyN 26. Apr 2024 21:23

syncOjs.TEvent extrem langsam
 
Hallo,

heute ist mir folgendes passiert: In meiner Anwendung habe ich ein 'klassisches' Eventszenario mit einem Thread mit waitforOject und einem Autoresetevent, der relativ oft (ca alle 10ms) aufgerufen wird.
Bisher habe ich das über die Windows API (CreateEvent, SetEvent etc.) gelöst.
Heute habe ich, im Zuge einer Fehlersuche, den Event durch syncOjs.TEvent ersetzt. Dabei hat sich die CPU Load, den der Taskmanager anzeigt, unter win10/64 (Delphi: 10.3 Rio) um ca den Faktor 3 erhöht :?
Das ganze konnte ich wirklich an diesem Umbau festmachen.

Jetzt frage ich mich, ob das wirklich so ist, und ob auch andere Syncobjekte wie TMutex oder TCriticalsection betroffen sind.

Tomy

jaenicke 26. Apr 2024 21:39

AW: syncOjs.TEvent extrem langsam
 
TEvent ist eine direkte Kapselung der Event-API. Der Unterschied könnte im WaitFor-Aufruf liegen. TEvent kann man mit zwei verschiedenen Warteroutinen verwenden:
CoWaitForMultipleHandles (UseComWait = True) und WaitForMultipleObjectsEx (UseComWait = False)

Ich rate dir daher das WaitFor mit der vorher bei dir verwendeten Implementierung zu vergleichen.

TomyN 26. Apr 2024 21:42

AW: syncOjs.TEvent extrem langsam
 
Hi,

Also ich habe einfach if myEvent.waitFor(XXX) = wrSignaled verwendet, halt analog zu dem
If ( WaitForSingleObject(myEventHandle, XXX) = wait_object_0 ) das ich vorher hatte.

jaenicke 26. Apr 2024 23:08

AW: syncOjs.TEvent extrem langsam
 
Und mit welchen Parametern erzeugst du TEvent?

TomyN 27. Apr 2024 05:59

AW: syncOjs.TEvent extrem langsam
 
Code:
myEvent := syncObjs.TEvent.Create(false);
Nachdem es bei
Code:
myEvent := syncObjs.TEvent.Create(nil, false, false, nil);
was analog zum bisherigen
Code:
myEventHandle := CreateEvent(nil, false, false, nil);
gewesen wäre, eine Fehlermeldung des Compilers gegeben hatte.

shebang 29. Apr 2024 11:12

AW: syncOjs.TEvent extrem langsam
 
Zitat:

Zitat von TomyN (Beitrag 1536163)
Code:
myEvent := syncObjs.TEvent.Create(false);

Mit diesem Aufruf ist ManualReset=True im Gegenatz zu deinem bisherigen Code.
Delphi-Quellcode:
constructor TEvent.Create(UseCOMWait: Boolean);
begin
  Create(nil, True, False, '', UseCOMWait);
end;


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