winforms - 如何从线程设置 ToolStripProgressBar 的值?

标签 winforms multithreading c++-cli clr

现在,我知道当大多数人看到这种问题时,他们会想“哦,使用委托(delegate)”。嗯,正在使用委托(delegate)。这是迄今为止唯一拒绝与他们合作的控件。我也没有使用BackgroundWorker。

我自己为 System::Threading::Thread 编写了一个包装类,因为我知道我会大量使用它们。我为该类提供了各种委托(delegate)事件,以便它可以与 UI 线程交互。我一直使用它主要只是为了设置状态栏的状态。我还有一个进度条一直没用过,所以我想添加它。我给了它一个委托(delegate),但是当我运行它时,它崩溃并出现臭名昭著的错误:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll

Additional information: Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.

我现在很困惑,因为据我所知,我使用委托(delegate)的方式与使用其他控件的方式相同。这一款很特别吗?我在互联网上进行了广泛的搜索,得到的只是 C# BackgroundWorker 问题,这些问题并不真正适用于此。这是我的委托(delegate)的代码:

代表:

delegate void               OnThreadProgressUpdateDel(int progress, String^ status);

保存事件的变量:

OnThreadProgressUpdateDel^  m_updateProgressEvent;

事件绑定(bind)方式:

thread->OnThreadProgressUpdate += gcnew ObjectLoadThread::OnThreadProgressUpdateDel(this, &CObjectLoader::ProgressUpdate);

事件名为:

void CObjectLoader::ProgressUpdate(int progress, String^ status)
{
    gGlobal->ProgramProgress->Maximum = 100;
    gGlobal->ProgramProgress->Value = progress; //Crash here...
    gGlobal->SetProgramStatus(status);
}

此处调用:

m_updateProgressEvent->Invoke(1, "Loading objects...");

这个愚蠢的 ToolStripProgressBar 有什么特别之处,使它不想更新:(

在 Microsoft Visual C++ 2008 Express Edition 中使用 C++ CLR、Windows 窗体应用程序。

最佳答案

“ToolStripProgressBar 没有 Invoke 方法。”

你是对的;但是 toolStripProgressBar.ProgressBar.Invoke 和 InvokeRequired 确实存在并且按预期运行。

关于winforms - 如何从线程设置 ToolStripProgressBar 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10305734/

相关文章:

c# - 如何在用户控件上公开组合框数据绑定(bind)

C# - 自动添加 'X' 个按钮,一个接一个。

windows - 此文件位于本地网络之外的位置

c# - 多线程加载xml文件到内存

java - netty DefaultChannelPipeline异常捕获

c# - c++/cli 仅将内部成员公开给托管类

c# - 动态创建的 TextBox 没有焦点,MinimumSize 和 Font 已更改

java - 同一 ExecutorService 中的多个生产者和单个消费者

C++ - 在我关闭程序之前 ofstream 不会输出到文件

.net - C++ 与 C++/CLI : Const qualification of virtual function parameters