gpt4 book ai didi

c++ - 非托管代码上的托管 system.timer

转载 作者:行者123 更新时间:2023-11-30 02:11:08 25 4
gpt4 key购买 nike

新来的团体,抱歉,如果这是错误的论坛/礼仪。我在编码需要使用定时器触发事件​​的 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)

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

包含后,更改:

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。

最佳答案

对于 VS2010 CLI/C++

提供的代码是非托管 C++。如果管理数据流类,它将是

class ref DataStream {...}

而不是呈现

class DataStream {...}

另外,如果类(class)被管理的话

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 方法的事件处理程序

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

example from MSDN在最底部的示例下。

关于c++ - 非托管代码上的托管 system.timer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3822231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com