我想在它自己的Thread中调用callbackmethod
。 callbackMethod
将作为接口实现。
我已经宣布了一个类似于以下的主题:
CustomfunctionCallbackThread = Class(TThread)
protected
procedure Execute; override;
private
var mCallId: String;
var mCallbackMethod: ICustomfunctionCallback;
var mParam: pCustomParam;
var mError: integer;
procedure callCallbackMethod;
public
procedure setData(callbackObject: pCustomfunctionCallbackObject);
end;
现在我正在调用那个线程:
procedure classname.method(param :pCustomParam; callId: String; error: integer; callback: ICustomfunctionCallback);
var callbackObject: ^CustomfunctionCallbackObject;
var callbackThread: CustomfunctionCallbackThread;
begin
callbackObject.param:= param;
callbackObject.error:= error;
callbackObject.callId:= callId;
callbackObject.callbackMethod:= callback;
callbackThread:= CustomfunctionCallbackThread.Create(true);
callbackThread.setData(callbackObject);
callbackThread.FreeOnTerminate:= true;
callbackThread.Start;
end;
setData函数如下所示:
procedure CustomfunctionCallbackThread.setData(callbackObject: pCustomfunctionCallbackObject);
begin
mCallId:=callbackObject.callId;
mParam:=callbackObject.param;
mError:=callbackObject.error;
mCallbackMethod:=callbackObject.callbackMethod;
end;
我的执行函数如下:
procedure CustomfunctionCallbackThread.Execute;
begin
mCallbackMethod.callCustomfunctionCallback(mParam, mCallId, mError);
end;
现在,回调方法(接口)如下所示:
procedure CustomfunctionCallback.callCustomfunctionCallback(param: pCustomParam; callId: String; error: integer);
var receivedCustomfunctionCallback: string;
begin
receivedCustomfunctionCallback:= 'CustomfunctionCallback received: Param - ' +
PAnsiChar(param^.getKey(0)) + ' | Value - ' + PAnsiChar(param^.getValue(0));
Form_PAis.Utf8Convert(receivedCustomfunctionCallback);
Dispose(param);
end;
该函数按预期运行,但之后将自动退出调试模式。
如果它看起来像那样:
procedure CustomfunctionCallback.callCustomfunctionCallback(param: pCustomParam; callId: String; error: integer);
var receivedCustomfunctionCallback: string;
begin
receivedCustomfunctionCallback:= 'CustomfunctionCallback received: Param - ' +
PAnsiChar(param^.getKey(0)) + ' | Value - ' + PAnsiChar(param^.getValue(0));
Form_PAis.output.Append(receivedCustomfunctionCallback);
Dispose(param);
end;
会崩溃(不退出)
Form_PAis.output.Append(receivedCustomfunctionCallback);
你有什么想法,如何解决这个问题?
答案 0 :(得分:1)
转义线程proc的异常将导致整个进程被关闭。在threadproc(Execute方法)中放置一个异常处理程序来捕获所有异常。像这样:
procedure CustomfunctionCallbackThread.Execute;
begin
try
mCallbackMethod.callCustomfunctionCallback(mParam, mCallId, mError);
except
on e: Exception do
begin
// output or log this error somewhere.
end;
end;
end;
上面的代码至少应该有助于防止整个过程崩溃。您仍然需要找到并修复导致异常的原因。
在可疑的Form_PAis.output ...行之前或之前,在回调函数中设置断点。运行应用程序直到它为断点停止。在调试器中,使用监视窗口或检查器检查所涉及的变量和属性的值。 Form_PA是否为空? Form_PAis.output是否为空?之前检查语句的变量,因为归因于异常的行号有时超过实际原因一行。