2011-10-28 42 views
1

試圖做到這一點像我在一些例子中發現:如何Tick事件添加到系統:視窗:形式:定時器在非託管類

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:「系統::事件處理」:對委託 構造無效的參數;代表目標需要成爲指向會員的指針 功能

橋是非託管類。 所以我宣佈的timerId是這樣的:

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

我在做什麼錯在這裏?如何添加Tick事件?

+0

你爲什麼要這樣做?如果您使用託管計時器,只需使用託管類型即可。 – ildjarn

回答

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... 
    } 
}; 
+0

應該是,橋是非託管類,我使用gcroot定時器 – Cynede

+2

那麼,這解釋了它。如何設法編譯採用託管對象的本機方法有點神祕。您需要使用Marshal :: GetDelegateForFunctionPointer()來獲取一個指向本機函數的委託對象。目標函數必須是靜態的,它不能是一個類的實例方法。或者設置計時器來調用託管方法,然後調用本地方法。 –

+0

你的意思是我的System :: Void Bridge :: timer1_Tick(System :: Object^sender,System :: EventArgs^e)是不受管理的,不能被調用?我必須讓它成爲gcroot嗎? – Cynede

相關問題