Multithreading 返回从另一个线程调用委托的结果
我有一个带有TabControl的GUI。每个新选项卡页都是通过一个新线程创建的。我想调用Multithreading 返回从另一个线程调用委托的结果,multithreading,delegates,c++-cli,invoke,Multithreading,Delegates,C++ Cli,Invoke,我有一个带有TabControl的GUI。每个新选项卡页都是通过一个新线程创建的。我想调用this->tabControl->TabCount,但是tabControl属于我调用的线程以外的线程。因此,我需要调用一个委托。然而,我在网上找到的所有示例都显示了从每个委托方法打印到std::cout。我需要一个返回值,在本例中为int delegate int MyDel(); int InvokeTabCount() { if (this->InvokeRequired) {
this->tabControl->TabCount
,但是tabControl
属于我调用的线程以外的线程。因此,我需要调用一个委托。然而,我在网上找到的所有示例都显示了从每个委托方法打印到std::cout
。我需要一个返回值,在本例中为int
delegate int MyDel();
int InvokeTabCount()
{
if (this->InvokeRequired)
{
MyDel^ del = gcnew MyDel(this, &MyTabControl::InvokeTabCount);
auto temp = this->Invoke(del); // can't just "return this->Invoke(del)"
return temp; // Invoke() returns a System::Object^
}
else
{
return this->tabControl->TabCount;
}
}
void CreateNewTab()
{
// do stuff
this->tabControl->TabPages->Insert(InvokeTabCount() - 1, myNewTab); // insert a tab
this->tabControl->SelectTab(InvokeTabCount() - 2); // OutOfBounds and tabPageNew
}
System::Void MethodToAddNewTabPage() //actually a click event but whatever
{
System::Threading::Thread^ newThread =
gcnew System::Threading::Thread(
gcnew System::Threading::ThreadStart(this, &MyTabControl::CreateNewTab));
newThread->Start();
}
当前,我的InvokeTabCount()
方法正在返回-1
,而我只是this->Invoke(del)
而不返回它。我无法返回它,因为我的方法希望返回int
,而不是System::Object^
,后者是Invoke()
返回的。但是,在调试时,我发现auto temp
包含正确的值2
。并且temp->ToString()
包含值“2”
,该值也是正确的
如何返回此->调用(del)
?
是否需要在InvokeTabCount()
方法中设置全局变量的值?我想我可以找到一种方法,将System::String^
转换为std::String
,以利用std::stoi()
,但这似乎是一种奇怪的解决方法
当前解决方案:
delegate int MyDel();
int InvokeTabCount()
{
if (this->InvokeRequired)
{
MyDel^ del = gcnew MyDel(this, &MyTabControl::InvokeTabCount);
auto temp = this->Invoke(del);
return int::Parse(temp->ToString());
}
else
{
return this->tabControl->TabCount;
}
}
结果是一个整数,已装箱并包含在对象^
引用中。您应该能够简单地将其强制转换为int
如果您想更加安全,请执行空检查并验证temp->GetType()
是否返回int::typeid
,但这可能有些过分,因为您正在那里创建委托(仍然是键入的形式)