2010-09-29 118 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。