托管system.timer over un托管代码

时间:2010-09-29 13:50:34

标签: c++

小组新手,对不起,如果这是错误的论坛/礼仪。我正在编码 需要使用定时器触发事件​​的c ++应用程序 处理程序。我决定使用System :: Timers :: Timer中提供的计时器。 我对下一部分的理解不是很好,就像我的代码一样 透露,但据我了解,我的应用程序是“非托管C ++”, 而管理系统DLL的计时器扩展。所以我 需要使用gcroot模板来包含 “托管”计时器代码。

#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)

起初,我没有包括&amp;编译器建议的参考 因为我见过的大多数例子都没有使用它。

包含后,更改:

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

所以我在这一点上陷入困​​境。我不确定解决方案是否有点小 远离我所在的地方,或者这些错误是否表示a 更大的问题(即我使用gcroot模板和混合管理 和没有经验的非托管代码)。我正在使用Visual C ++ Express Edition Beta。

2 个答案:

答案 0 :(得分:4)

对于VS2010 CLI / C ++

提供的代码是非托管C ++。如果管理了Datastream类,那么它将是

class ref DataStream {...}

而不是呈现

class DataStream {...}

此外,如果班级被管理,那么

gcroot<Timer^> m_Timer;

将是

Timer^ m_Timer;

nextCandle方法需要是静态的,或者来自托管类。

静态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的EventHandler

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

添加使用托管类

中的nextCandle方法的EventHandler
m_Timer->Elapsed += gcnew ElapsedEventHandler(this, &DataStream::nextCandle);
在最底层的示例下,

example from MSDN

答案 1 :(得分:0)

你的nextCandle函数需要是静态的,或者是一个独立的函数。由于混合托管代码和非托管代码,这不是错误,这是所有托管代码。

问题是你的成员函数传递了一个隐藏的 this 参数,这很少是预期的函数原型。