AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

verhindern: Klick auf Titelleiste stoppt Programm

Ein Thema von SevenOfNine · begonnen am 27. Nov 2010 · letzter Beitrag vom 29. Nov 2010
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: verhindern: Klick auf Titelleiste stoppt Programm

  Alt 27. Nov 2010, 12:33
Der Durchgriff vom Thread auf die visuellen Komponenten hat durchaus seine Tücken.

Der Hinweis im Quelltext (wenn man ein Thread-Objekt erstellt) alle Zugriffe auf die Oberfläche (HauptThread, bzw. einen anderen ThreadKontext) mittels Synchronize zu realisieren sollte man unbedingt beachten.

Allerdings muss gerade vor diesem Hintergrund folgendes beachten:
Delphi-Quellcode:
procedure TFooThread.Execute;
begin
  while not Terminated do
    begin
      Synchronize( MainForm.Method ); // Es geht erst dann weiter, wenn die Methode komplett abgearbeitet wurde
    end;
end;
Wenn jetzt der HauptThread der Anwendung blockiert ist (durch das Festhalten der TitelLeiste) dann würde in diesem Falle auch der Thread blockiert und damit haben wir hiermit keine Lösung des Problems.

Besser ist es in so einem Fall folgendes zu verwenden:
Delphi-Quellcode:
procedure TFooThread.Execute;
begin
  while not Terminated do
    begin
      Queue( MainForm.Method );
    end;
end;
Die Ausführung der Methode wird in eine Warteschlange gestellt und der HauptThread führt diese dann aus, wenn er wieder Zeit dafür hat. Der Thread wird aber nicht mehr blockiert.
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 Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: verhindern: Klick auf Titelleiste stoppt Programm

  Alt 27. Nov 2010, 12:44
@Sir Rufo

jepp, ich habe wieder mal zu kurz gedacht...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
taveuni

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

AW: verhindern: Klick auf Titelleiste stoppt Programm

  Alt 27. Nov 2010, 13:24
Besser ist es in so einem Fall folgendes zu verwenden:
Delphi-Quellcode:
procedure TFooThread.Execute;
begin
  while not Terminated do
    begin
      Queue( MainForm.Method );
    end;
end;
Die Ausführung der Methode wird in eine Warteschlange gestellt und der HauptThread führt diese dann aus, wenn er wieder Zeit dafür hat. Der Thread wird aber nicht mehr blockiert.
Meinst Du damit die Queue von einem 2. Thread abarbeiten zu lassen?
Oder ist das Queue(MainForm.Method) hier eine Methode welche ich noch nicht kenne?
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: verhindern: Klick auf Titelleiste stoppt Programm

  Alt 27. Nov 2010, 13:28
Queue kenne ich auch nicht. Aber sollte das ein Zugriff auf das Formular sein, muss er synchronisiert werden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
taveuni

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

AW: verhindern: Klick auf Titelleiste stoppt Programm

  Alt 27. Nov 2010, 13:34
Hallo Luckie,

Ja ist schon klar.
Aber in Sir Rufos Anwort werden eben diese in eine Queue geschoben.
Denn der Thread macht ja eigentlich was anderes.
Meiner Ansicht nach müssen diese Methoden in der Queue aber dann
von einem anderen Thread abgearbeitet werden. Ansonsten wär es ja witzlos.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

AW: verhindern: Klick auf Titelleiste stoppt Programm

  Alt 27. Nov 2010, 19:15
Es kommt speziell darauf an was du in der Oberfläche aktualisieren willst. Willst du nur eine Progressbar aktualisieren wäre eine Variante den aktuellen Fortschritt in einer Variablen abzulegen und per Timer dann diesen Status in regelmäßigen Abständen abfragen. Oder anstelle von syncronize einfach Nachrichten posten (mit Postmessage). Aber es kommt immer darauf an was genau man machen will um zu schauen welche Methode die beste ist.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: verhindern: Klick auf Titelleiste stoppt Programm

  Alt 27. Nov 2010, 19:21
@SirThornberry

falls Deine Antwort an mich gerichtet war, es ging mir darum daß IMHO eine CriticalSection eineindeutig zu sein hat wenn sie den gewünschten Effekt haben soll, oder bin ich hier auf dem ganz falschen Dampfer.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: verhindern: Klick auf Titelleiste stoppt Programm

  Alt 27. Nov 2010, 19:22
Nein, du bist auf dem richtigen Dampfer. SirThornberry fährt mit dem Code auf der Titanic und der Eisberg ist nicht mehr weit.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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
 
#9

AW: verhindern: Klick auf Titelleiste stoppt Programm

  Alt 27. Nov 2010, 13:38
Delphi-Referenz durchsuchenQueue leistet im Prinzip das gleiche wie Delphi-Referenz durchsuchenSynchronize mit einem entscheidenden Unterschied:

Synchronize( AMethod ) arbeitet die Methode in einem synchronisiertem Kontext ab (klar, das wissen wir alle).
Wenn in dieser Methode jetzt eine Wahnsinns-Berechnung durchgeführt wird, die z.B. so 10 Sekunden dauert, dann wird auch der Thread (aus dem Synchronize aufgerufen wurde) für genau diese 10 Sekunden quasi unterbrochen.

Queue( AMethod ) übergibt das (intern) an eine MessageQueue und der HauptThread arbeitet diese ab, wenn er dafür Zeit hat.
Der Thread läuft aber direkt danach weiter und wird nicht durch die lange Abarbeitung unterbrochen.

Somit hat Synchronize ein blockierendes und Queue eine nicht blockierendes Verhalten.
Ansonsten sind die gleich

Aber in Sir Rufos Anwort werden eben diese in eine Queue geschoben.
Denn der Thread macht ja eigentlich was anderes.
Meiner Ansicht nach müssen diese Methoden in der Queue aber dann
von einem anderen Thread abgearbeitet werden. Ansonsten wär es ja witzlos.
Wird die doch auch ... vom HauptThread oder jedem anderen, den man dabei mitgibt (genau wie beim Synchronize)
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
taveuni

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

AW: verhindern: Klick auf Titelleiste stoppt Programm

  Alt 27. Nov 2010, 13:40
Bitte Bitte sag mir dass es das auch bei Delphi 2007 schon gibt.
Kanns leider hier zu Hause nicht überprüfen.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:28 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