如何在非托管类中将 Tick 事件添加到 System::windows::Forms::Timer

Posted

技术标签:

【中文标题】如何在非托管类中将 Tick 事件添加到 System::windows::Forms::Timer【英文标题】:How to add Tick event to System::windows::Forms::Timer in unmanaged class 【发布时间】:2011-10-28 09:30:45 【问题描述】:

我正在尝试像我在某些示例中找到的那样:

TimerID = gcnew System::Windows::Forms::Timer(); 
TimerID->Tick += gcnew System::EventHandler(this, &Bridge::timer1_Tick);

System::Void Bridge::timer1_Tick(System::Object^  sender, System::EventArgs^  e) 

    Bridge::DoUpdate();

但由于错误无法创建事件处理程序:

错误 C3364:“System::EventHandler”:委托的参数无效 构造函数;委托目标需要是指向成员的指针 功能

Bridge 是非托管类。 所以我以这种方式声明 TimerID:

gcroot<System::Windows::Forms::Timer ^> TimerID;

我在这里做错了什么?如何正确添加 Tick 事件?

【问题讨论】:

你为什么要这样做?如果您使用托管计时器,请使用托管类型。 【参考方案1】:

您没有发布足够的代码来诊断错误。这样编译:

public ref class Bridge : public System::Windows::Forms::Form

    Timer^ TimerID;
public:
    Bridge(void) 
        InitializeComponent();
        TimerID = gcnew System::Windows::Forms::Timer(); 
        TimerID->Tick += gcnew System::EventHandler(this, &Bridge::timer1_Tick);        
    
private:
    void Bridge::timer1_Tick(System::Object^  sender, System::EventArgs^  e) 
    
    void InitializeComponent(void) 
        // etc...
    
;

【讨论】:

应该是,Bridge 是非托管类,我正在使用 gcroot for Timer 嗯,这就解释了。您如何设法编译采用托管对象的本机方法有点神秘。您需要使用 Marshal::GetDelegateForFunctionPointer() 来获取针对本机函数的委托对象。目标函数必须是静态的,不能是类的实例方法。或者只是将计时器设置为调用托管方法,然后再调用本机方法。 你的意思是我的 System::Void Bridge::timer1_Tick(System::Object^ sender, System::EventArgs^ e) 也是不受管理的,不能被调用?我必须让它 gcroot 吗?

以上是关于如何在非托管类中将 Tick 事件添加到 System::windows::Forms::Timer的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PQT5 中将事件添加到标签

如何在 UseEffect 中将事件侦听器添加到 UseRefs

如何在非托管 C++ 中捕获托管异常(来自委托)?

如何在iOS中将触摸事件发送到superview?

如何在 PyQt4 中将事件监听器添加到动态 QTableWidgetItem?

如何在extjs mvc的网格中将控制器事件添加到href