Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Windows Message WMChildActivate (https://www.delphipraxis.net/32159-windows-message-wmchildactivate.html)

Nuclear-Ping 19. Okt 2004 16:48


Windows Message WMChildActivate
 
Ahoi USS DP! :)

Meine Anwendung ist ein MDI mit nur einer Child-Form, welche mehrfach instanziert werden kann.

Ich fange in dieser Child-Form die Message WM_CHILDACTIVATE ab, um in dieser verschiedene nötige Routinen durchführen zu lassen.

Soweit, sogut, solange es bei nur einer Instanz der Form bleibt.

Sobald aber eine weitere hinzukommt und angezeigt wird, bzw. ich zwischen den Childs wechsel, bombardiert Windows meine App mit WM_CHILDACTIVATE-Messages, was in diesem Fall dazu führt, dass sich das Wechseln zw. den Children unglaublich lange hinauszögert.

Code von der Message-Prozedur:
Delphi-Quellcode:
{ ************************************************************ }
procedure TPMainForm.WMChildActivate (var Msg: TWMChildActivate);
{ ************************************************************ }
var
  BT, ET: Cardinal;
begin
  inherited;

  AddToLog ('Message: #' + inttostr (Msg.Msg) + ' Result: ' + inttostr (Msg.Result));

  { ... }

  if Assigned (PQuickPlanetPhases) then
    begin
      BT := GetTickCount;
      PQuickPlanetPhases.UpdatePlanetPhases (NatalHoroscope,
                                             TransitHoroscope);
      ET := GetTickCount;
      AddToLog ('UpdatePlanetPhases: ' + inttostr (ET - BT) + ' Ticks');
    end;
end;
Log vom ersten Start des Programms bei einer Instanz:
Code:
Message: #34 Result: 0
UpdatePlanetPhases: 62 Ticks
Soweit ist alles im akzeptablen und grünen Bereich.

Wenn ich nun jedoch eine zweite Instanz erzeuge bzw. zwischen den Children hin- und her-schalte dauert der Vorgang auf meinem Rechner hier (AMD 2100+, 512MB, WinXP Prof) ca. 3sek, auf einem anderen Rechner (Notebook, eigentlich P4 (k.a. welcher Prozi), Win98, k.a. wieviel RAM) vlt. 1-2min :pale: (ich hab echt davor gesessen und gewartet)!

Der Log sieht bei mir dann wie folgt aus:
Code:
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
Message: #34 Result: 0
UpdatePlanetPhases: 47 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 47 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 47 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 47 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 47 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 32 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 47 Ticks
UpdatePlanetPhases: 63 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 47 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 63 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 62 Ticks
UpdatePlanetPhases: 32 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 32 Ticks
UpdatePlanetPhases: 47 Ticks
UpdatePlanetPhases: 46 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 47 Ticks
UpdatePlanetPhases: 31 Ticks
UpdatePlanetPhases: 63 Ticks
Message: #34 Result: 0
UpdatePlanetPhases: 47 Ticks
Also er kriegt zig mal die Message und arbeitet ebenfalls zig mal die Routinen dadrin ab, was entsprechend dauert ...

Hat jemand eine Idee, warum das so ist und wie man das lösen kann? Das sind einfach unakzeptable Werte und Ergebnisse und ich hab keine Ahnung, warum und woher die kommen ... :wall:

Bin für jegliche Tips und Hilfen wie immer sehr dankbar! :)

Grüße,
Mario

Nuclear-Ping 19. Okt 2004 17:12

Re: Windows Message WMChildActivate
 
OK, ein Lösungsansatz wäre, sowas wie eine "Ampel-Schaltung" da rein zu machen.

Also eine Bool'sche Variable für die Child-Form herzunehmen und die beim FormCreate der Child-Form auf FALSE zu setzen.

Kommt nun ein WM_CHILDACTIVATE, wird die Variable dieser Instanz auf TRUE gesetzt und die aller anderen Instanzen auf FALSE. In der Message-Prozedur wird nun geprüft, ob diese Variable auf TRUE ist, wenn ja, Exit, wenn nein auf TRUE setzen und die aller anderen Instanzen auf FALSE.

Umgesetzt hab ich's schon, das funktioniert auch ohne Probleme. :thumb: Aber mich würde es jetzt trotzdem noch interessieren, ob es da was "saubereres" gibt?

Grüße,
Mario


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