新的羣體,抱歉,如果這是錯誤的論壇/禮儀。我正在編碼 一個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。
只需要注意一點,如果在每行的起始位置用四個空格對其進行格式化,則代碼看起來會更好。請參閱http://stackoverflow.com/editing-help – 2010-09-29 13:53:36