@Zaher220
Software developer

Как осуществить вызов формы из потока?

Здравствуйте. Делаю веб морду для приложения. Для этого использую веб сервер mongoose. Приложение написано на с++ .Net.

Основное приложение и сервер находятся в разных потоках. Для взаимодействия между ними реализован класс посредника, реализован как синглтон.

Задача сводится к тому, чтобы посредством посредника из сервера вызывать функции формы.
Код формы
public ref class MainForm : public System::Windows::Forms::Form{
...
public:MainForm(void){
	doWithEffect^ up;
	up = gcnew doWithEffect(this,&hitekfloor::MainForm::moveEffectUp);
	doWithEffect^ down;
	down = gcnew doWithEffect(this,&hitekfloor::MainForm::moveEffectDown);
	MediatorBetweenProgrammAndWebServer::getInstance()->setFucntionForEffects(up,down);
}
public: bool moveEffectUp(int num){/*Эта функция должна вызываться из MediatorBetweenProgrammAndWebServer  */
	if (this->InvokeRequired){
		doWithEffect^ d = gcnew doWithEffect(this, &moveEffectUp);
		this->Invoke(d, gcnew array<Object^> {num});
	}else
		SchedulerModel->MoveItemUp(num);
	return true;
}
};

Делегат
public delegate bool doWithEffect(int num);
Код посредника
ref class MediatorBetweenProgrammAndWebServer : System::Object{
public:
	static MediatorBetweenProgrammAndWebServer^ getInstance();
	void resetInstance();
	void setFucntionForEffects(doWithEffect^ up, doWithEffect^ down);

	void MoveEffectUp(unsigned int itemIndex);
	void MoveEffectDown(unsigned int itemIndex);

protected:
	MediatorBetweenProgrammAndWebServer();
	~MediatorBetweenProgrammAndWebServer();
private:
	static MediatorBetweenProgrammAndWebServer^ m_mediator;
	doWithEffect^ upEffect;
	doWithEffect^ downEffect;
};

mediator.cpp
...
void MediatorBetweenProgrammAndWebServer::setFucntionForEffects(doWithEffect^ up, doWithEffect^ down){
	upEffect = up;
	downEffect = down;
	return;
}
...

Как видно из приведенных огрызков кода, моя идея состоит в том, чтобы вместо того, чтобы передавать в посредник указатель на форму, передать ему делегаты требуемых функций. К сожалению, получаю следующий результат при вызове moveEffectUp из посредника:
A first chance exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
  • Вопрос задан
  • 2534 просмотра
Решения вопроса 1
Trrrrr
@Trrrrr
msdn.microsoft.com/ru-ru/library/zyzhdc6b%28v=vs.1... Может Invoke вам надо?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы