Как передать ссылку на функцию-член Winform в другой поток другого класса?

Я пытаюсь обновить окно рисунка Winform из другого класса, запущенного в другом потоке.
Я последовал за ответом в Обновить элементы управления WinForm из другого потока _and_ class которая, как представляется, содержит всю информацию, за исключением того, как именно передать ссылку на функцию-член Winform / Winform в поток в конструкторе / как вызвать функцию-член Winform из потока.

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

//Camera.h

public class CameraThread
{
public:
CameraThread(????)
{
// constructor
}

void DoSomething
{
// call UpdateBox on Form1
????
}
};

//Form1.h
namespace SV7 {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

public ref class Form1 : public System::Windows::Forms::Form
{
private: CameraThread* CT;
private: boost::thread* ImageACQ;

public: delegate void UpdateDelegate(void);
public:
Form1(void)
{
CT = new CameraThread(????);
boost::thread* ImageACQ = new boost::thread(&CameraThread::ImageAcquisition,CT);
InitializeComponent();
InitializeCanny();
}

void UpdateBox(void)
{
if (this->RawImageBox->InvokeRequired)
{
UpdateDelegate^ d = gcnew UpdateDelegate(this,&Form1::UpdateBox);
this->RawImageBox->BeginInvoke(d);
}
else
{
}
}
};
}

Где я поместил ????, я не знаю, какой синтаксис использовать для передачи / вызова функции-члена. Я предполагаю, что предварительное объявление Form1 необходимо в моем Camera.h, но возникли проблемы со ссылкой на фактический класс формы в Form.h. Однако, если бы использовался прямой указатель на функцию, то я не думаю, что так будет.

В качестве фона я использую VS2010 SE C ++. Я пытаюсь создать отдельный поток, который захватывает изображения с веб-камеры, обрабатывает их с помощью OpenCV, а затем отображает результаты в графическом окне в потоке графического интерфейса.

Я просто не знаю, как это сделать, и буду признателен за любые рекомендации. Заранее спасибо/

0

Решение

Вам нужен экземпляр Form1 внутри класса, поэтому ваш вызов конструктора должен выглядеть так:

CT = new CameraThread(this);

Я не очень разбираюсь в C ++ / CLI, так что, возможно, это не идеальный синтаксис, но смысл должен быть ясен. Ваш класс должен взять экземпляр Form1 и сохранить его до тех пор, пока он не понадобится для вызова UpdateBox:

public class CameraThread
{
private:
Form1^ form;
public:
CameraThread(Form1^ form)
{
// constructor
this->form = form;
}

void DoSomething
{
// call UpdateBox on Form1
form->UpdateBox();
}
};

Обратите внимание, что вы смешиваете две мощные библиотеки: .NET Framework и boost. Если они вам не нужны и то и другое ты должен придерживаться один из них. В .NET Framework тоже есть потоки.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]