编辑: 现在我对发生的事情有了更好的了解,我想我可以更好地说出这个问题,因此它更有用。
我试图在C ++中复制以下delphi代码
TThread.Queue(nil,
procedure
begin
LogMessage("test");
end
);
代码的目的是调用一个方法,以线程安全的方式更新表单上的TMemo
。这是我尝试使用Thread.Queue
void __fastcall TClientForm::LogMessage( String message )
{
MemoLog->Lines->Add( message );
}
因为我使用的是没有CLANG增强功能的BCC32编译器,所以不能使用Lambda。相反,根据this documentation,我需要创建一个继承自TThreadProcedure
的类,它会覆盖Invoke()
方法来完成我需要完成的工作。然后我可以将该类的实例传递给TThread::Queue
。
我创建了以下继承TThreadProcuedure
并包含调用方法的类。
class TMyThreadProcedure : TThreadProcedure
{
void __fastcall Invoke( String message );
};
但是,由于TThreadProcedure
是一个抽象类,我不能简单地创建它的实例以传递给TThread::Queue
。当我将类的实例传递给TThreadProcedure
时,从TThread::Queue
继承并定义要调用的函数的正确方法是什么?
答案 0 :(得分:7)
如文件中所述:
How to Handle Delphi Anonymous Methods in C++
您有两种选择:
派生一个实现适当接口的类 1 (在本例中为Classes::TThreadProcedure
),覆盖Invoke()
方法以完成您想要的工作。然后,您可以将该类的实例传递给TThread::Queue()
。例如:
class TLogMessageRef : public TCppInterfacedObject<Classes::TThreadProcedure>
{
private:
TClientForm *form;
public:
TLogMessageRef(TClientForm* _form) : form(_form) {}
INTFOBJECT_IMPL_IUNKNOWN(TInterfacedObject);
void __fastcall Invoke()
{
form->LogMessage("test");
}
};
TThread::Queue(NULL,
Classes::_di_TThreadProcedure(
new TLogMessageRef(this)
)
);
( 1 TCppInterfacedObject
和INTFOBJECT_IMPL_IUNKNOWN
的使用在文档的其他地方介绍:Inheritance and Interfaces)
如果您需要在代码的多个位置使用匿名方法/过程,文档还提供了一个可重用的TMethodRef
类来帮助实现:
Using a Functor (Function Object)
例如:
struct LogMsg
{
TClientForm* form;
LogMsg(TClientForm *_form) : form(_form) {}
void operator()()
{
form->LogMessage("test");
}
};
typedef TMethodRef<Classes::TThreadProcedure, LogMsg, void> MyMethRef;
TThread::Queue(NULL,
Classes::_di_TThreadProcedure(
new MyMethRef(
LogMsg(this)
)
)
);
,您可以在任何需要匿名过程/方法的地方使用C ++ lambda:
TThread::Queue(NULL,
[this]() -> void { LogMessage("test"); }
);