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
Poolspieler

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

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

  Alt 2. Jul 2012, 13:54
Hallo Zusammen,
danke für Eure Antworten!

Ja, ich nutze Delphi XE2 Update4.
Unter Win7 habe ich das Problem (noch...) nicht gesehen.
Es tritt aber unter WinXP auf. Mit und ohne Delphi-IDE.

Meine Anwendung nutzt bereits Threads für die UDP-Kommunikation und allem was dazu gehört.
Jede kleine (oder auch größere...) Datei-IO und vor allem die Bedienung des UDP-Threads in einen Thread auszulagern fand ich nicht sinnvoll - oder liege ich da falsch?

Beispiel:
Code:
if OpenDialog.Execute then begin
  ...
  // Dateiinhalt auf konsistenz prüfen (CRC, etc.) --> dauert ca. 2 Sekunden
  if _fehler then begin
    showmessage('Es ist ein Fehler aufgetreten!'); // dieser Dialog bleibt manchmal im Hintergrund
  end;
end;
--> warum sollte man dies in einen Thread verpacken? Ist das nicht zu viel Aufwand?

Viele Grüße,

Poolspieler
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

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

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
 
#3

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
 
#4

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
 
#5

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.518 Beiträge
 
Delphi 12 Athens
 
#6

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
 
#7

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
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 16:25 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