AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form
Thema durchsuchen
Ansicht
Themen-Optionen

Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

Ein Thema von Poolspieler · begonnen am 2. Jul 2012 · letzter Beitrag vom 3. Jul 2012
Antwort Antwort
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 14:00
Hallo Poolspieler,

ich glaube, dass es relativ wenig Aufwand ist bei XE2, eine vorhandene Methode in einem Thread ausführen zulassen. Man sollte nur irgendwie evtl. prüfen, ob hier VCL-Sachen gemacht werden. Und ein Versuch wäre es Wert.

Die Methode mit dem GhostingWindow heißt übrigens DisableProcessWindowsGhosting und das Problem existiert SEIT XP und nicht nur bei XP. In welchem Zusammenhang die Delphiversion steht, kann ich natürlich nicht sicher beantworten. Ich hatte damals große Probleme mit Delphi2007 und ein XE-Benutzer hatte die Probleme glaub ich nicht.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules

Geändert von ChrisE ( 2. Jul 2012 um 14:02 Uhr)
  Mit Zitat antworten Zitat
Poolspieler

Registriert seit: 9. Aug 2004
165 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 14:13
Hallo ChrisE,
vielen Dank für den guten Hinweis - so tritt das Problem (offensichtlich...) nicht mehr auf.

Hier der Code von http://stackoverflow.com/questions/1...odal-is-called:
Code:
procedure DisableProcessWindowsGhosting;
var
  DisableProcessWindowsGhostingProc: procedure;
begin
  DisableProcessWindowsGhostingProc := GetProcAddress( 
    GetModuleHandle('user32.dll'),
    'DisableProcessWindowsGhosting');
  if Assigned(DisableProcessWindowsGhostingProc) then
    DisableProcessWindowsGhostingProc;
end;
"Dumme" Frage:
Welche tolle Möglichkeit hat man denn unter XE2 eine beliebige Routine in einem eigenen Thread laufen zu lassen?
Vor allem, wenn man trotzdem synchronisiert z.B. showmessage nutzen muss?

Gruß,

Poolspieler
Andreas
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
542 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 15:05
Welche tolle Möglichkeit hat man denn unter XE2 eine beliebige Routine in einem eigenen Thread laufen zu lassen?
Vor allem, wenn man trotzdem synchronisiert z.B. showmessage nutzen muss?
z.b. anonyme Prozeduren in anonymen Threads

Delphi-Quellcode:
procedure MySynchProcedure(Param1: String; Param2: TObject; Param3: TDictionary<Integer, TMyObject>);
begin
  TThread.Queue(Nil,
  procedure
  begin
    // do anything synchronized here
  end);
end;

procedure DoAnythingTimeConsuming;
var
  Thrd: TThread;
begin
  Thrd: TThread.CreateAnonymousThread(
  procedure
  begin
    // do anything time consuming stuff here
    sleep(100000);
    
    MySynchProcedure(Param1, Param2, Param3);
  end);
  Thrd.FreeOnTerminate:= True;
  Thrd.Start;
end;
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.

Geändert von taveuni ( 2. Jul 2012 um 15:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 15:43
Hallo,

genau sowas, wie das Beispiel von taveuni hab ich gemeint.

Und das jetzt das DisableProcessWindowsGhosting funktioniert, zeigt ja, dass hier etwas stattfindet im Mainthread, dass eigentlich ausgelagert werden sollte in einen Thread. Denn es blockt den Mainthread so sehr, dass Windows denkt, die Anwendung wäre abgestürzt bzw. würde fest hängen.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.542 Beiträge
 
Delphi 12 Athens
 
#5

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 16:22
Das FreeOnTerminate ist nicht nötig, da es im Constructor des TAnonymousThread schon auf true gesetzt wird.
Delphi-Quellcode:
TThread.CreateAnonymousThread(procedure
  begin
    ...
  end).Start;

// oder

TAnonymousThread.Create(procedure
  begin
    ...
  end).Start;
Man könnte aber auch das FreeOnTerminate auf false setzen und eine Warteschleife (ähnlich dem DelayDelay) anhängen, welche auf den Thread wartet, aber die GUI sich aktualisieren läßt.

Die anonymen Methoden können sogar Variablen hin und her verwalten.
Delphi-Quellcode:
proedure Test;
var
  xyz: string;
begin
  xyz := 'abc';

  TThread.CreateAnonymousThread(procedure
    var
      i: Integer;
    begin
      for i := 0 to 29 do begin
        xyz := xyz + IntToStr(i mod 10);
        Sleep(1000);
      end;
      TThread.Synchronize(nil, procedure
        begin
          ShowMessage(xyz);
        end;
    end).Start;
end;
Und das Schöne, man sieht hier sogar direkt den Programmablauf, was sich aber eher nur für kurze Methoden eignet, also für längeren Code sollte man besser eine getrennte Prozedur/Methode übergeben.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 2. Jul 2012 um 16:37 Uhr)
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
542 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 16:48
Delphi-Quellcode:
// oder

TAnonymousThread.Create(procedure
  begin
    ...
  end).Start;
Wie kriegst Du denn das kompiliert?
Das ist ja in der Klassenfunktion TThread.CreateAnonymousThread drin.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.542 Beiträge
 
Delphi 12 Athens
 
#7

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 18:07
Das ist eine anonyme Methode.
Sie wird einfach an Ort und Stelle deklariert, wo man sie verwenden will.

Die gibt es seit Delphi 2009. (genauer, seitdem es die Generics gibt)

- Unicode
- Record-Methoden (schau dir z.B. mal Delphi-Referenz durchsuchenTRect an)
- Record-Operatoren
- Generics
- anonyme Methoden
- ...
Es gab halt in letzer Zeit einige Neuerungen.



Der Parameter des CreateAnonymousThread/Create wurde als procedure of deklariert, womit man dort alles mögliche übergeben kann.
Delphi-Quellcode:
type
  TMyProcedure = procedure; // nimmt nur Prozeduren auf
  TMyMethod = procedure of object; // nimmt nur Methoden auf
  TMyAnonymus = reference to procedure; // nimmt alles auf (dahinter versteckt sich ein geheimes generisches Interface)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 2. Jul 2012 um 18:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:43 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