1

我遇到了问题,我的 TThreadList 的内容似乎在我的线程中丢失了。

我在“PConnect”类中创建了以下变量:

var mCustomfunctionCallbackThread: CustomfunctionCallbackThread; 

和一个像下面这样的全局变量:

var mCustomfunctionCallbackThreadList: TThreadList; 

现在我在我的“PConnect”类中填充这个变量,如下所示:

function PConnect.callCustomfunction(plugin, method: PAnsiChar; param :CustomParam; callback: ICustomfunctionCallback; callId: PAnsiChar): integer;
var paramName: PAnsiChar;
var id: PAnsiChar;
var error: integer;
var callbackList: TList;
var customfunctionCallback : ^CustomfunctionCallbackObject;
begin
     callbackList:= mCustomfunctionCallbackThreadList.LockList;

     new (customfunctionCallback);
     customfunctionCallback.callId:= id;
     customfunctionCallback.callbackMethod:= callback;
     callbackList.Add(customfunctionCallback);

     mCustomfunctionCallbackThreadList.UnlockList;
     exit(0);
end; 

在收到回调后,将调用以下函数。此函数应将其他丢失的数据附加到 TThreadList 条目并在此之后启动一个线程:

procedure PConnect.customfunctionCallbackReceived(param :CustomParam; callId: PAnsiChar; error: integer);
var customfunctionCallbackList: TList;
var it: TListEnumerator;
var callbackObject: ^CustomfunctionCallbackObject;
begin
    customfunctionCallbackList:= mCustomfunctionCallbackThreadList.LockList;
    it:= customfunctionCallbackList.GetEnumerator;
    while(it.MoveNext) do
    begin
        callbackObject:= it.GetCurrent;
        if strcomp(callbackObject.callId,callId) = 0 then
        begin
            callbackObject.param:= param;
            callbackObject.error:= error;
            break;
        end;
    end;
    mCustomfunctionCallbackThreadList.UnlockList;
    mCustomfunctionCallbackThread.Start();
end;  

Thread 的 Execute 方法应该获取 TThreadList 的内容并使用该参数调用函数。

procedure CustomfunctionCallbackThread.Execute;
var callback: ICustomfunctionCallback;
var customfunctionCallbackList: TList;
var it: TListEnumerator;
var callbackObject: ^CustomfunctionCallbackObject;
var param: CustomParam;
var callId: PAnsiChar;
var error: Integer;
begin
    customfunctionCallbackList:= mCustomfunctionCallbackThreadList.LockList;
    it:= customfunctionCallbackList.GetEnumerator;
    while(it.MoveNext) do
    begin
        callbackObject:= it.GetCurrent;
        if callbackObject.error <> NULL then
        begin
            callback:= callbackObject.callbackMethod;
            param:= callbackObject.param;
            error:= callbackObject.error;
            callId:= callbackObject.callId;

            callback.callCustomfunctionCallback(param, callId, error);
            customfunctionCallbackList.Remove(callbackObject);
            break;
        end;
    end;
    mCustomfunctionCallbackThreadList.UnlockList;
end; 

继承人的问题,以下变量刚刚得到垃圾或空指针:

param:= callbackObject.param;
error:= callbackObject.error;
callId:= callbackObject.callId;

我希望它已经足够描述了:)

我会很高兴得到一些帮助:)

4

1 回答 1

0

当你这样做

customfunctionCallback.callId:= id

变量id尚未初始化。这意味着当您稍后检查时

strcomp(callbackObject.callId,callId) = 0

它的行为是不明确的,因为callbackObject.callId从未初始化。然后发生的是,您看到的定义不明确的行为是表达式永远不会计算结果True,因此您永远不会分配给paramorerror字段。这与你的观察一致。

我怀疑您应该将callId其设为变量并将传递给string的参数的值复制到其中。但由于我不知道你在做什么的所有细节,所以我不能 100% 确定这一点。callIdPConnect.callCustomfunction

其他一些评论:

  • 你真的是想给你的班级命名PConnect吗?通常我们在类前面加上T.
  • for in如果您使用循环而不是循环,代码会更容易阅读while
  • 包含Remove对列表的调用的循环效率低下。您已经找到该项目,调用Remove只是再次搜索列表。执行该循环的方法是for使用索引的类循环。当你找到要删除的项目时,调用Delete传递项目的索引。
  • 当您删除一个项目时,您无法调用Dispose,这意味着您泄漏了内存。
于 2013-03-08T11:02:38.577 回答