2010-09-29 95 views
1

新的羣體,抱歉,如果這是錯誤的論壇/禮儀。我正在編碼 一個C++應用程序,需要使用定時器觸發的事件 處理程序。我決定使用System :: Timers :: Timer中提供的定時器。 我的下一個部分的理解是不是很好,因爲我的代碼可以 透露,但據我所知,我的應用程序是「非託管C++」, 而從系統DLL定時器擴展管理。因此我需要使用gcroot模板以允許包含 「託管」計時器代碼。託管的system.timer over un託管代碼

#include <vcclr.h> 

#using <mscorlib.dll> 
using namespace System; 

#using <System.dll> 
using namespace System::Timers; 

class DataStream 
{ 
    public: 
    DataStream():m_N(48),m_saving(false) 
    { 
     // set up the window timer 
     m_Timer = gcnew Timer; 
     m_Timer->Elapsed += gcnew 
     ElapsedEventHandler(DataStream::nextCandle); 
     m_Timer->Interval= CANDLE_DURATION * 1000; 
     m_Timer->AutoReset= true; 
     m_Timer->Enabled=true; 
    }; // default constructor 

private: 
    gcroot<Timer^> m_Timer; /* use gcroot because can't use managed object in unmanaged class. */ 

    void nextCandle(Object ^sender, ElapsedEventArgs ^e); 

}; 

void DataStream::nextCandle(Object ^sender/*source*/, ElapsedEventArgs ^e/*e*/) 
{ 
    // do some stuff ... 
} 

這裏的問題,在編譯時,我得到這個錯誤:

Compiling... 
dataStream.cpp 
c:\blah\dataStream.h(18) : error C3867: 'DataStream::nextCandle': 
function call missing argument list; use '&DataStream::nextCandle' to 
create a pointer to member 
c:\blah\dataStream.h(18) : error C3350: 
'System::Timers::ElapsedEventHandler' : a delegate constructor expects 
2 argument(s) 

起初,我並沒有包括&參考編譯器 建議,因爲我看到的大多數例子不用這個。

在包容,改變:

m_Timer->Elapsed += gcnew ElapsedEventHandler(DataStream::nextCandle); 

到....

m_Timer->Elapsed += gcnew ElapsedEventHandler(&DataStream::nextCandle); 

我得到編譯以下錯誤:

c:\blah\dataStream.h(18) : error C3364: 
'System::Timers::ElapsedEventHandler' : invalid argument for delegate 
constructor; delegate target needs to be a pointer to a member function 

所以,我被困在這點。我不知道如果解決方案是一些小的變化 離我所在的地方,或者,如果這些錯誤指示 更大的問題(即我使用gcroot模板和混合管理 和非託管代碼與在零經驗)。我正在使用Visual C++ Express Edition Beta。

+0

只需要注意一點,如果在每行的起始位置用四個空格對其進行格式化,則代碼看起來會更好。請參閱http://stackoverflow.com/editing-help – 2010-09-29 13:53:36

回答

0

你nextCandle功能必須是靜態的,或者一個獨立的功能。由於混合託管代碼和非託管代碼,這不是錯誤,這是所有託管代碼。

問題是你的成員函數傳遞一個隱藏的這個參數,這很少是函數原型的預期。

4

對於VS2010 CLI/C++

提供的代碼是非託管C++。如果數據流類是管理這將是

class ref DataStream {...} 

,而不是呈現

class DataStream {...} 

此外,如果類是管理,然後

gcroot<Timer^> m_Timer; 

Timer^ m_Timer; 

nextCandle方法ne編輯爲靜態,或從託管類。

靜態nextCandle聲明看起來像:

class DataStream { 

private: 
    gcroot<Timer^> m_Timer; /* use gcroot because can't use managed object in unmanaged class. */ 

    static void nextCandle(Object ^sender, ElapsedEventArgs ^e); 

} 

要添加使用靜態nextCandle

m_Timer->Elapsed += gcnew ElapsedEventHandler(DataStream::nextCandle); 

要添加使用nextCandle方法從一個託管類的事件處理程序的事件處理程序

m_Timer->Elapsed += gcnew ElapsedEventHandler(this, &DataStream::nextCandle); 

example from MSDN在極端例子下TTOM。