Newsgroup: it.comp.lang.delphi
Titolo: thread exceptions

come posso gestire l'evento OnException in un Thread ?
Ho questo codice in un thread e in una form creo il thread e gli
assegno questo codice ma non viene mai scaturito il codice della
procedura myOnException
    { Public declarations }
    procedure myOnException(Sender:TObject);
procedure TMainForm.Button1Click(Sender: TObject);
begin
  //creo il thread
  ThreadDataCheck := TthrDataCheck.CreateIt;
  ThreadDataCheck.OnException:=myOnException;
end;
procedure TMainForm.myOnException(Sender: TObject);
begin
   Panel5.Caption:=ThreadDataCheck.LastException;
end;
---------------------------------------------------------------
type
  TthrDataCheck = class(TThread)
  private
    { Private declarations }
    FOnException: TNotifyEvent;
    FException: Exception;
    procedure DoHandleException;
  protected
    { protected declarations }
    procedure Execute; override;
    procedure HandleException; virtual;
  public
    { public declarations }
    LastException:string;
  published
    { published declarations }
    constructor CreateIt;
    property OnException:TNotifyEvent read FOnException write
FOnException;
  end;
procedure TthrDataCheck.DoHandleException;
begin
  // Cancel the mouse capture
  if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0,
0);
  // gestisco la visualizzazione dell' exception
    if FException is Exception then
      Application.ShowException(FException)
    else
      SysUtils.ShowException(FException, nil);
    LastException:= FException.Message;
    if Assigned(Self.FOnException)then
      Self.FOnException(Self);
  end;
end;
procedure TthrDataCheck.HandleException;
begin
  FException := Exception(ExceptObject);
  try
    // non visualizzo il messaggio "EAbort"
    if not (FException is EAbort) then
      Synchronize(DoHandleException);
  finally
    FException := nil;
  end;
end;
constructor TthrDataCheck.CreateIt;
begin
  inherited Create (True);  // Create thread suspended
  FreeOnTerminate := True;
  Priority        := tpNormal;
  FException := nil;
  try
    Application.MainForm.Caption:=FloatToStr(StrToFloat
(Application.MainForm.Caption) / 2);
  except on E: Exception do
    begin
      LastException:='prova 1 - ';
      HandleException;
    end;
  end;
  Suspended       := False;
end;

 procedura myOnException
Perchï¿œ sei in uno spazio di indirizzamento diverso.
Non ï¿œ bene gestire le eccezioni in questo modo, tienile incapsulate 
dentro ogni thread e lavora con proprietï¿œ o metodi di callback.
Almeno, questo ï¿œ il mio modo di pensare.
Potresti verificare se tramite callback puoi passargli indietro degli 
exception.. ma ripeto che non mi piacciono i jump da un heap 
all'altro..
Se qualcuno ha soluzioni migliori, libero di implementarle.
-- 
Morde

 come posso gestire l'evento OnException in un Thread ?
Le eccezioni vanno gestite all'interno del thread e comunicate al thread
principale mediante messaggi.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

il mio problema è che ho una unit con un thread e una form principale
che crea il thread, poi il thread non deve includere nelle uses di
delphi la form principale (se nel thread uso la main form coi
postmessage posso gestire tutto) in quanto vorrei che la sua gestione
fosse completamente slegata dalla form (successivamente ne vorrei fare
un componente). Spero di essermi spiegato bene. Grazie.

 Spero di essermi spiegato bene. Grazie.
Fai come suggerito da laforgia.
Il thread, di cui non ci dai alcuna informazione a riguardo, non deve 
conoscere il mainform tramite uses.
-- 
Morde

 il mio problema � che ho una unit con un thread 

Eh, e quindi? tu hai un thread che comunica mediante messaggi con la form
principale. Tutto ci� che deve conoscere � l'handle della form. Quando si
scatena un'eccezione, non fa altro che mandare alla form principale un
messaggio contenente il messaggio dell'eccezione. Dov'� il problema?
