Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TThread und Exceptions (https://www.delphipraxis.net/35359-tthread-und-exceptions.html)

Neelix 6. Dez 2004 08:28


TThread und Exceptions
 
Guten Morgen.

In diesem Thread Neuzeichnen von TStatusbar wurde als möglicher Workaround vorgeschlagen, die einzelnen Querys in einen oder mehrere TThreads auszulagern. Die Queries sind im "Hauptthread" in einem Try/Except-Block eingeschlossen. Es werden also gewisse Aktionen ausgeführt, wenn einzelne Abfragen daneben gehen. Diese Try/Except-Block müßte ich ja nun auch in den neuen Thread übernehmen. Aber wie bekommt der Hauptthread jetzt mit, daß etwas schief gegangen ist? :wall: :gruebel:

Luckie 6. Dez 2004 12:31

Re: TThread und Exceptions
 
Du könntest eine Nachricht schicken oder eine Flöag setzten, welches du abfragst, .... Der Fantasie sind keine Grenzen gesetzt. ;)

Neelix 6. Dez 2004 12:44

Re: TThread und Exceptions
 
Was passiert eigentlich, wenn in einem Thread eine Exception auftritt. Bekommt der Haupt-Thread diese mit? Ich habe jetzt in TThread im Prinzip folgendes Konstrukt:
Delphi-Quellcode:
  try

      sStatusBarText := 'Erstelle tmp_StartVtr';
      Synchronize(SetStatusBarText);
.
.
diverses Queris ausführen
.
.

  except
      on E: EOleException do
      begin
        sStatusBarText := 'Fehler bei Auswählen der Quelldatensätze' + #13#10 +
                  E.Message + #13#10 +
                  'Bitte Eingaben überprüfen:' + #13#10 +
                  ' Alias ' + fMain.edSourceDB.Text + #13#10 +
                  ' User ' + fMain.edSourceUser.Text;
        StrPCopy(cDummy, sDummy);
        Application.MessageBox(cDummy, 'Fehler', MB_ICONERROR);
        fMain.edSourceDB.SetFocus;
        sStatusBarText := 'Mit Fehler beendet';
        Synchronize(SetStatusBarText);
        fMain.DropTempTables();
        exit;
      end;
  end;
Oder sollte man den den Aufruf des Threads in Try/Except einschließen?

DerDan 6. Dez 2004 12:45

Re: TThread und Exceptions
 
Ich hab gute Erfahrungen mit der folgenden Konstruktion gemacht:

Delphi-Quellcode:
procedure TThreadA.SyncException;
begin
  Application.MessageBox (pchar (ExceptionString) , 'Exception', MB_OK);
end;


procedure TThreadA.Execute;
begin
  try
    ...
  except
    on E: Exception do begin
      ExceptionString := E.Message;
      Synchronize (SyncException);
    end;
  end;
end;
dabei ist ExceptionString eine Variable des Thread


mfg

derDan

DerDan 6. Dez 2004 12:51

Re: TThread und Exceptions
 
Im Prinzip kannst du das so machen.

allerdings sooltest du nicht auf Variablen oder Funktionen der/des anderen Threads zugriffen.

Also Ausnahme gilt diese Synchronize Methode.

Wichtife Felder der Main - Form würde ich in Thread Variablen kopieren bevor der Thread gestartet wird. alles andere mit der Synchronize Methode synchronisieren.

Exceptions aus einem Thread sehen die anderen Threads nicht auch nicht der Haupt Thread.

mfg

DerDan

Neelix 6. Dez 2004 12:58

Re: TThread und Exceptions
 
Hallo Dan,

danke für den Tip. Habe mein Programm entsprechend geändert. Bauchschmerzen habe ich allerdings noch mit dem SetFocus. Darf ich aus dem Thread heraus?

sakura 6. Dez 2004 13:00

Re: TThread und Exceptions
 
Zitat:

Zitat von Neelix
Bauchschmerzen habe ich allerdings noch mit dem SetFocus. Darf ich aus dem Thread heraus?

Sollte gehen, da SetFocus als Windows-Botschaft implementiert ist und somit durch die Haupt-Nachrichten-Methode abgearbeitet wird, wenn es denn dann soweit ist.

...:cat:...

DerDan 6. Dez 2004 13:20

Re: TThread und Exceptions
 
Könnte gehen mit SetFocus,

würd ich aber vermeiden!

ich kann nichts mehr _nicht_ leiden als das ich in Word oder so was tippe und irgendein Programm meint es müsse nun den Focus bekommen.
egal aus welchem Grund.


Da gibts auch noch eine Möglichkeit, das die Title Bar blinkt.

derDan

Neelix 6. Dez 2004 13:25

Re: TThread und Exceptions
 
Zitat:

Zitat von DerDan
ich kann nichts mehr _nicht_ leiden als das ich in Word oder so was tippe und irgendein Programm meint es müsse nun den Focus bekommen.

SetFocus auf einEditBox bedeutet doch nicht, daß das Programm auch gleich in den Vordergund kommt, oder?

sakura 6. Dez 2004 14:42

Re: TThread und Exceptions
 
Zitat:

Zitat von Neelix
SetFocus auf einEditBox bedeutet doch nicht, daß das Programm auch gleich in den Vordergund kommt, oder?

Doch. Entweder mit einem Fehler: Versuch ein verstecktes Fenster zu fokusieren, oder das Fenster, in welchem Du den Fokus setzt ist eh schon fokusiert ;)

...:cat:...


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