C ++ Использование AsyncCallback - PullRequest
       3

C ++ Использование AsyncCallback

0 голосов
/ 16 октября 2018

У меня есть метод, например:

void Something::DoSomething(double d1, double d2, void* callback)
{
  AsyncCallback^ acb = gcnew AsyncCallback(this, System::IntPtr(callback)); //error C3364: 'System::AsyncCallback' : invalid argument for delegate constructor; delegate target needs to be a pointer to a member function 
  sensor->BeginSearch(d1, d2, acb);
}

Как мне заставить это работать?

Этот метод оболочки может быть экспортирован и будет использоваться собственным приложением c ++.

РЕДАКТИРОВАТЬ:

После некоторых поисков мой текущий прогресс выглядит следующим образом:

.h

typedef std::tr1::function<void(void)>* callback_function;
ref class Something
{
  public:
  void DoSomething(double d1, double d2, callback_function callback);
  void DoSomethingCallback (IAsyncResult^ ar);

  private:
  callback_function m_callback;
}

.cpp

void Something::DoSomething(double d1, double d2, callback_function callback)
{
  m_callback = callback;
  AsyncCallback^ acb = gcnew AsyncCallback(this, &Something::DoSomethingCallback);
  sensor->BeginSearch(d1, d2, acb);
}
void Something::DoSomethingCallback(IAsyncResult^ ar)
{
  (*m_callback());
}

Использование в собственном коде:

ч.

class NativeClass
{
  public:
  void NativeFunction(double d1, double d2);

  std::tr1::function<void()> m_callback;
}

.cpp

void NativeClass::NativeFunction(double d1, double d2)
{
  m_callback = std::tr1::bind(&SomethingElse::DoSomethingCallback, this);
  sensor->DoSomething(d1, d2, &m_callback);
}

void SomethingElse::DoSomethingCallback(void)
{
  // Does something
}

Теперь, похоже, работает.Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что мой управляемый код выдает следующее исключение где-то в (*m_callback()), когда программа останавливается в классе с именем xxfunction:

An unhandled exception of type System.AccessViolationException occurred in .dll  Additional information: An attempt was made to read or write in the protected memory. This is an indication that other memory is corrupted.

1 Ответ

0 голосов
/ 16 октября 2018

&SomethingElse::DoSomethingCallback - это адрес функции-члена.

typedef void (*callback_function)(void); - указатель на функцию, не являющуюся членом.

Эти два несовместимы.

Возможно, вы хотели std::function<void(void)>, но вы не можете поместить это непосредственно в управляемый тип, поэтому вы получите

typedef std::function<void(void)>* callback_function;

, который будет называться

(*m_callback)(); // works for pointer to std::function, and also the most correct syntax for a plain function pointer

И тогда ваш ref class Something нуждается в конструкторе копирования, назначении копирования и деструкторе, чтобы должным образом освободить собственный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...