Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren (https://www.delphipraxis.net/155036-fenster-vom-rendern-von-daten-abhalten-um-applikationsleistung-zu-optimieren.html)

TheJeed 5. Okt 2010 23:05

Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Hallo zusammen!

Ich habe eine für mich sehr interessante Problemstellung von einem Freund vorgelegt bekommen. Er arbeitet alltäglich mit einer großen Industrielösung, wobei eine gigantische Datenmenge zu verarbeiten ist - soweit ich weiß geht es darum, ein großes Dokument, welches eine Knotenstruktur beinhaltet, zu öffnen. Das Öffnen nimmt fünf Stunden in Anspruch, da die Anwendung "nebenbei" damit beschäftigt ist, die Daten in regelmäßigen, kurzen Abständen in der GUI zu aktualisieren.

Wenn man das entsprechende Fenster davon abhält, indem man auf seinen Rahmen klickt und die Taste gedrückt hält, als wollte man seine Größe ändern, dann wird die Oberfläche nicht weiter aktualisiert und das Öffnen beschleunigt sich etwa um den Faktor 10(!).

Unsere Idee war nun, dem Fenster die entsprechende Aktion programmatisch von Delphi aus vorzugaukeln. Unser er Ansatz war, WM_SIZING - Messages an das Fenster zu senden, was aber keinen Erfolg brachte. Auch mit den Mausklick-Messages hat es nicht funktioniert.

Daher meine Fragen: Wie kann ich einem Fenster vortäuschen, dass ich es gerade in den "Größe ändern" - Modus versetze? Wenn Euch dazu etwas einfällt - ist es möglich, die Maus trotzdem nebenbei zum Arbeiten zu nutzen? Hat jemand ne andere Idee?

Vielen Dank,

David

P.S.: Anfragen beim Hersteller werden zwar berücksichtigt, benötigen aber meist ein halbes Jahr oder länger, um als Patch/Update ins Produkt einzufließen und sind daher keine Option.

plusplus 5. Okt 2010 23:51

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Vieleicht koenntest du versuchen den fester zu verbergen. Dann wird es nicht updated.

Mit FindWindow kannst du den Handle finden. Und dann mit ShowWindow(Handle, SW_HIDE) es verbergen.

Aber um ehrlich zu sein, dass wird dir vieleicht 25% zeit ersparen. Ich denke naemlich dass deine datei verarbeited wird, und darum braucht es so lange. Fenster Update ist da bestimt nicht ein grosses faktor.

TheJeed 6. Okt 2010 00:17

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Danke für den Tipp - wir werden es probieren. Wir wissen aber bereits, dass es am Update des Fensters liegt, denn wenn wir auf den Rahmen klicken, und dann die linke Maustaste beschweren, sodass sie dauerhaft gedrückt wird, führt das exakt zur erwähnten Reduzierung von 5 Stunden auf 20 Minuten.

Luckie 6. Okt 2010 00:35

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Minimiere es einfach.

Zitat:

Zitat von plusplus (Beitrag 1054012)
Fenster Update ist da bestimt nicht ein grosses faktor.

Unter Windows schon.

franktron 6. Okt 2010 07:57

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Ich würde mal sagen das ist der Falsche Ansatz-

Ich würde die Komponenten die die Daten anzeigen das Aktualisieren unterbinden undzwar mit BeginUpdate und EndUpdate.

Kalfany 6. Okt 2010 08:05

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Schau dir mal MSDN-Library durchsuchenWM_SETREDRAW an bzw. hier

Luckie 6. Okt 2010 09:25

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Zitat:

Zitat von franktron (Beitrag 1054028)
Ich würde mal sagen das ist der Falsche Ansatz-

Ich würde die Komponenten die die Daten anzeigen das Aktualisieren unterbinden undzwar mit BeginUpdate und EndUpdate.

Ich glaube, er hat keinen Zugriff auf den Quellcode. Das scheint ein fremdes Programm zu sein.

TheJeed 6. Okt 2010 11:41

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Genau, es ist eine kommerzielle closed source Anwendung. WM_SETREDRAW werden wir uns mal ansehen :)

shmia 6. Okt 2010 15:04

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Ungetestet:
Delphi-Quellcode:
procedure LockWindow(handle:HWND; lock: boolean);
begin
   if handle = 0 then exit;
   if lock then SendMessage(handle, WM_SETREDRAW, 0, 0)
   else begin
      SendMessage(handle, WM_SETREDRAW, 1, 0);
      RedrawWindow(handle, nil, 0,
         RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN);
   end;
end;

rollstuhlfahrer 6. Okt 2010 17:04

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Prüfe bitte bei der Funktion auch auf INVALID_HANDLE_VALUE.

Bernhard

TheJeed 7. Okt 2010 16:03

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Also vielen Dank für Eure Beteiligung. Wir haben es mit WM_SETREDRAW probiert, aber das führte "nur" zu einem komischen Verhalten beim Zeichnen des Fensters. Sein Inhalt wurde trotzdem weiter gerendert. Als nächstes ist der Tipp von shmia dran:thumb:.

Außerdem schauen wir gerade in den ReactOS-Sourcen nach Hinweisen, die uns Rückschlüsse auf die Arbeitsweise von Windows erlauben:http://doxygen.reactos.org/d1/da1/su...ce.html#l00684

Es muss doch möglich sein...

Meflin 7. Okt 2010 16:11

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Zitat:

Zitat von Luckie (Beitrag 1054015)
Minimiere es einfach.

Ob das was bringt... Fenster, die nicht im Vordergrund sind, erhalten auch keine Priority Boosts mehr - wodurch die zur Verfügung gestellte Rechenzeit halbiert werden dürfte.

himitsu 7. Okt 2010 16:18

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1054138)
Prüfe bitte bei der Funktion auch auf INVALID_HANDLE_VALUE.

Das gilt Datei/Schnittstellen-Handle und Ähnliches (Delphi=THandle C=HANDLE:? ), welche z.B. über CreateFile erstellt werden.
> diese haben den Wert für "unüglig" als Unsigned(-1), also INVALID_HANDLE_VALUE

Bei Fenster-Handles (HWND) ist das anders.
> diese haben den Wert für "ungültig" als 0 (aka NULL in C)


@TheJeed:
- Um was für eine Komponente handelt es sich denn und was wir dargestellt?
- Betrifft das Neuzeichnen das ganze Fenster oder nur die eine Subkomponente?
- Soll etwas sichtbar bleiben, wärend des Ladens oder kann der Bereich auch leer bleiben?
- ...

Luckie 7. Okt 2010 16:47

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Zitat:

Zitat von Meflin (Beitrag 1054359)
Zitat:

Zitat von Luckie (Beitrag 1054015)
Minimiere es einfach.

Ob das was bringt... Fenster, die nicht im Vordergrund sind, erhalten auch keine Priority Boosts mehr - wodurch die zur Verfügung gestellte Rechenzeit halbiert werden dürfte.

Ich habe keine, da ich nicht weiß, um was für ein Programm es sich handelt, was es macht, wie es sich neu zeichnet oder wie es programmiert wurde. Aber man kann es ja mal probieren.

TheJeed 7. Okt 2010 18:00

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Das Programm ist Dassault Catia. Nach einem Missverständnis zwischen meinem Bekannten und mir muss ich nun auch Euch darüber informieren, dass die "zeitraubende Komponente" keine ist, die auf einen normalen Canvas zeichnet, sondern dass es sich dabei um einen OpenGL-Render-Thread handelt. Das ist das Problem, wenn man Aufgabenstellungen telefonisch diskutiert...:oops::oops:

Dieses OpenGL Rendering setzt aus, wenn man das Fenster am Rahmen anklickt und festhält. Hätte ich gleich gewusst, dass es sich um OpenGL handelt, wären wir evtl. etwas schneller am Ziel gewesen: Ich habe ihm jetzt empfohlen, die Trialversion von GDEbugger herunterzuladen und darüber sämtliche Zeichenbefehle, die an die GPU gehen, zu deaktiveren. Ob wir damit erfolgreich sind, wird sich morgen Vormittag zeigen.

rollstuhlfahrer 7. Okt 2010 18:34

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
also wenn das ein eigener Thread ist, müsste es doch die Möglichkeit geben, diesen zu pausieren, oder? Dann hällt das Zeichnen zwischendurch an und danach muss der deaktivierte Thread wieder aktiviert werden. Wenn man jetzt nur wüsste, welcher Thread der richtige ist...

Bernhard

TheJeed 8. Okt 2010 11:49

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Verflixt, wir dürfen aufgrund der Lizenzkosten GDebugger nicht verwenden und müssen uns auf eine eigene Lösung konzentrieren. Am liebsten würd ich die "Zeichnen aussetzten" Funktion von GDebugger nachbilden - vielleicht ist es am Ende sogar einfacher als zu versuchen, das Fenster über das Versenden von Messages in den Skalierungsmodus zu versetzen.

Kalfany 11. Okt 2010 07:34

AW: Fenster vom Rendern von Daten abhalten um Applikationsleistung zu optimieren
 
Ich vermute mal ihr habt schon mal mit dem Hersteller über diese Problematik gesprochen? Denn irgendwie kann ich mir nicht vorstellen das die nicht daran interessiert sind einen solch exremen Mangel zu beseitigen, zumal ja scheinbar nicht viel nötig wäre um dem entgegenzuwirken (keine Ahnung was dieses Dassault Catia kostet! Denke mal 4-5 stelliger € Betrag?)


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