小组新手,对不起,如果这是错误的论坛/礼仪。我正在编码 需要使用定时器触发事件的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。
答案 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方法的EventHandlerm_Timer->Elapsed += gcnew ElapsedEventHandler(this, &DataStream::nextCandle);
在最底层的示例下,
答案 1 :(得分:0)
你的nextCandle函数需要是静态的,或者是一个独立的函数。由于混合托管代码和非托管代码,这不是错误,这是所有托管代码。
问题是你的成员函数传递了一个隐藏的 this 参数,这很少是预期的函数原型。