2010-09-27 104 views
8

我還有一個問題!請看看下面這個例子:如何在Delphi中將異常從一個線程傳遞到另一個線程(調用者的線程)?

// There is a class with some method: 
type 
    TMyClass = class 
    public 
    procedure Proc1; 
    end; 

    // There is a some thread class: 
    TMyThread = class(TThread) 
    protected 
    procedure Execute; override; 
    end; 

procedure TMyClass.Proc1; 
begin 
    // this method is just calling another thread: 
    with TMyThread.Create(True) do 
    begin 
    FreeOnTerminate := True; 
    Resume; 
    end; 
    // + there are some more actions 
end; 

procedure TMyThread.Execute; 
begin 
    // in this example this thread just throws exception: 
    raise Exception.Create('Some exception'); 
end; 

所有我想要的東西 - 就是要引發的異常在TMyClass.Proc1並把它像這樣:

var 
    myObject: TMyClass; 
begin 
    myObject := TMyClass.Create; 
    try 
    myObject.Proc1; // launch and watch what happenings 
    except 
    on E: Exception do 
     WriteErrorLog(E.Message); 
    end; 
    FreeAndNil(myObject); 
end; 

請告訴我,我該怎麼做的東西喜歡這個? 非常感謝!

哦!還有一件事 - 即時編碼在德爾福5,所以我沒有「FatalException」TThread的屬性或有關..

+2

您需要接受一個答案,或者如果沒有足夠完整的答案,您可以指示例如通過評論 – Remko 2010-09-29 11:27:08

回答

2

簡而言之,你不能這樣做你想要的。

您需要克隆異常對象,將副本傳遞給其他線程(例如,使用Synchronize方法或使用其他同步技術)並在那裏引發異常對象。

17

您可以使用AcquireExceptionObject()

AcquireExceptionObject返回一個指向當前異常對象,並防止異常對象被釋放當前的異常處理程序退出時。

然後你可以發送指針到另一個線程,如果你在那裏提出它會被釋放,否則你必須調用ReleaseExceptionObject()來釋放它。

+5

對AcquireExceptionObject()進行+1。由於它在Delphi 5中不可用,所以您應該從AsyncCalls.pas中複製Delphi 5的實現,可以從http://andy.jgknet.de/blog/?page_id=100下載。本單元還將向您展示如何以正確的方式使用代碼。 – mghie 2010-09-27 09:06:11

+0

AcquireExceptionObject線程安全嗎?至少我在多線程中使用它時會得到奇怪的結果,即阻塞發生? – 2013-03-16 00:05:47

+0

異常是一個對象的實例,所以我認爲它是線程安全的(支持文檔沒有提及它的事實) – Remko 2013-03-16 19:11:50

0

您最好捕獲線程上的執行循環中的異常,並將消息屬性和類名寫入私有字符串字段。然後這可以通過在吸氣和吸氣器中使用具有關鍵部分的屬性來公開,確保訪問是線程安全的。現在你所要做的就是傳入一個進程來處理異常並用同步來調用它。當我到達我的電腦時,我會發布一些示例代碼,因爲我現在正在使用我的iPhone

-1

我在我的多線程框架(http://www.csinnovations.com)中原生做這類事情/framework_overview.htm)。

+0

其實,我只注意到你還在使用Delphi 5,所以它不會有太大的幫助。 – Misha 2011-02-20 09:50:04

相關問題