Я пытаюсь обновить окно рисунка 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, а затем отображает результаты в графическом окне в потоке графического интерфейса.
Я просто не знаю, как это сделать, и буду признателен за любые рекомендации. Заранее спасибо/
Вам нужен экземпляр 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 тоже есть потоки.
Других решений пока нет …