2010-09-27 87 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

相关问题