AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Formular in Thread auslagern

Ein Thema von Gruber_Hans_12345 · begonnen am 3. Feb 2014 · letzter Beitrag vom 3. Feb 2014
Antwort Antwort
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.441 Beiträge
 
Delphi 2007 Professional
 
#1

Formular in Thread auslagern

  Alt 3. Feb 2014, 11:24
Hallo

Hab schon bisschen rumgesucht und auch schon das eine oder andere gefunden, aber bin mir nicht ganz sicher ob das nun funktionieren kann oder nicht.

Ich habe in meinem Programm einige Funktionen die halt länger dauern, und möchte nun einen Status anzeigen bzw. so eine Marquee oder so, das der user sieht, ok da tut sich noch was.
Da ich aus verschiedenen Probleme heraus dieses längeren Berechnungen nicht in einen Thread auslagern kann/will - möchte ich ein Progressfenster erzeugen,das in einem Thread ausgelagert ist.
Diesem Fenster schicke ich dann per Postmessage die Fortschrittsinfos, aber das Progressfenster soll den Fortschritt automatisch anzeigen/zeichnen.
Geht soetwas oder bekomme ich da probleme mit der VCL?

Ich hätte geplant entweder ein eigenes TApplication Objekt im Thread zu erezugen, oder eine eigene Messageschleife im Thread, bin mir aber ned sicher ob das 100% hinaut (Da so Thread fehler meist nicht immer auftreten ... )
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.848 Beiträge
 
Delphi 12 Athens
 
#2

AW: Formular in Thread auslagern

  Alt 3. Feb 2014, 11:28
Du kannst mit PostMessage problemlos aus dem Thread heraus arbeiten, solange du mit den beiden Parametern auskommst.

Eine besondere Messageschleife oder so etwas ist nicht erforderlich, weil die Abarbeitung im Hauptthread erfolgt. Da PostMessage die Message asynchron verschickt, arbeitet der Thread auch wie sicherlich gewünscht derweil einfach weiter, aber dennoch ohne den Hauptthread zu stören. Der muss nur dann auf die Message reagieren und die GUI entsprechend mit den neuen Werten aktualisieren.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.599 Beiträge
 
Delphi 12 Athens
 
#3

AW: Formular in Thread auslagern

  Alt 3. Feb 2014, 11:33
Wenn ich dich richtig verstanden habe, geht das so nicht! Du kannst lediglich die Berechnung in den Thread auslagern (unter bestimmten Bedingungen gehen auch Datenbankzugriffe). Alle VCL-Zugriffe (z.B. Anzeige des Fortschritts) müssen im Hauptthread stattfinden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Formular in Thread auslagern

  Alt 3. Feb 2014, 11:55
Es riecht hier nach Splash-Screen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.351 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Formular in Thread auslagern

  Alt 3. Feb 2014, 12:27
Ich sehe es wie Uwe.

Wenn Du Deine Berechnung im Mainthread lässt und in der Funktion (Schleife?) keine Neuzeichnung veranlasst wird sich das Formular nicht neu zeichnen.

Du hast wohl nur zwei Möglichkeiten:
a) Berechnung in eigenen Thread auslagern und immer mal durch Syncronisize einen Formularfortschritt veranlassen
b) komplett im Mainthread bleiben und immer mal Application.ProcessMessages aufrufen.

Ansonsten vielleicht noch eine andere Lösung nutzen, wie von Sir Rufo vorgeschlagen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.190 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Formular in Thread auslagern

  Alt 3. Feb 2014, 12:32
Als "Quick and Dirty"-Lösung ist der "Splashscreen" doch vielleicht wirklich nicht so übel. Allerdings bliebe doch weiterhin das Problem dass, wenn jemand auf deine "wirkliche" Anwendung klickt und sie schon 2, 3 Sekunden lang hängt, Windows es zu einem "Ghost Window" macht (ausgrauen, "(Reagiert Nicht)" in der Form-Caption anhängen).

In der gleichen Anwendung quasi eine "zweite VCL" aufmachen habe ich allerdings auch noch nie gesehen (muss allerdings nichts heißen). Ohne mir je ein typisches "Threaded Splashcreen"-Beispiel in Delphi angesehen zu haben würde ich es in eine DLL oder eigene exe auslagern und aus deinem Hauptprogramm musst du mittendrin nur das Fensterhandle wissen, an das du mit PostMessage etwas senden möchtest.

Wäre zumindest mein spontaner Gedanke. Aber weiterhin: Die richtige Lösung ist es eh nicht, in der Zeit kann man wahrscheinlich die Arbeit auch vernünftig in einen Thread auslagern und die Oberfläche erst gar nicht einfrieren lassen...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Formular in Thread auslagern

  Alt 3. Feb 2014, 13:19
Mal so ein kleiner Minimalcode:
Delphi-Quellcode:
var
  LForm : TForm;
  LThread : TThread;
begin
  LForm := TSplashScreen.Create( nil );
  try
    
    LThread := TStartupThread.Create( LForm );
    try

      LForm.ShowModel;
      LThread.WaitFor;

    finally
      LThread.Free;
    end;

  finally
    LForm.Free;
  end;
end;
TStartupThread muss lediglich am Ende eine Nachricht an die Form schicken, damit die geschlossen wird.
Alles weitere (Progress, Infos, ...) ist Zuckerguss und funktioniert auf die gleiche/ähnliche Art.

Das Erzeugen von VCL-Gedöns ausserhalb des MainThread-Context sollte man aber bleiben lassen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 06:08 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 by Thomas Breitkreuz