我在Visual Studio 2022的Managed C++/Cli中有这段程式码,我想在C++函式的不同阶段更新progressBar值。目前为止,我有3个委派UpdateUi(),更新UI完成()和更新进度(int percent)将int percent作为参数传递。这些委托具有UiDoSome方法(),UiDosomeDone()和UpdateProgressBar(int percent)。这段代码的运行方式是,单击一个按钮,就会启动一个新线程,该线程调用函数ThreadProc。SPP是Windows窗体类的名称。下面是我的代码:
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
Thread^ t = gcnew Thread(gcnew ThreadStart(this, &SPP::ThreadProc));
t->Start();
}
ThreadProc函数:
public: System::Void ThreadProc() {
label6->Invoke(gcnew UpdateUi(this, &SPP::UiDoSome));
-> progressBar1->Invoke(gcnew UpdateProgress(this, &SPP::UpdateProgressBar(25)));
//My code goes in here......
label6->Invoke(gcnew UpdateUiDone(this, &SPP::UiDosomeDone));
}
委派定义:
public: delegate void UpdateUi();
public: delegate void UpdateUiDone();
public: delegate void UpdateProgress(int percent);
委派的方法:
public: void UiDoSome() {
label6->Text = "processing...";
}
public: void UiDosomeDone() {
label6->Text = "Done!!!";
}
public: void UpdateProgressBar(int percent) {
progressBar1->Value = percent;
}
问题在于,当调用ThreadProc函数中的progressBar并向UpdateProgressBar方法传递一个值时,编译器会抛出一个错误:“表达式必须是左值或函数指示符”。我该如何解决这个问题,这在C++中甚至是可能的吗?我知道C#没有这样的问题。我感谢你的帮助。提前感谢。
1条答案
按热度按时间k4ymrczo1#
使用Invoke()时,您需要使用数组来传递参数,如下所示:
但是,首先你不能使用Invoke(),因为UI元素(按钮、标签等)只能从创建它们的线程安全地修改。因此,你必须在这里使用BeginInvoke()。同样,你可以使用窗体本身的BeginInvoke: