winforms 使用Visual Studio 2022在C++/CLI中使用带参数的线程和委托方法更新progressBar

lyfkaqu1  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(147)

我在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#没有这样的问题。我感谢你的帮助。提前感谢。

k4ymrczo

k4ymrczo1#

使用Invoke()时,您需要使用数组来传递参数,如下所示:

array<System::Object^>^ params = gcnew array<System::Object^>(1);
params[0] = 25;
Invoke(gcnew UpdateProgress(this, &SPP::UpdateProgressBar), params);

但是,首先你不能使用Invoke(),因为UI元素(按钮、标签等)只能从创建它们的线程安全地修改。因此,你必须在这里使用BeginInvoke()。同样,你可以使用窗体本身的BeginInvoke:

public: System::Void ThreadProc() {

    BeginInvoke(gcnew UpdateUi(this, &SPP::UiDoSome));

    array<System::Object^>^ params = gcnew array<System::Object^>(1);
    params[0] = 25;
    BeginInvoke(gcnew UpdateProgress(this, &SPP::UpdateProgressBar), params);

    BeginInvoke(gcnew UpdateUiDone(this, &SPP::UiDosomeDone));
}

相关问题