新的群体,抱歉,如果这是错误的论坛/礼仪。我正在编码 一个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