现在,我知道当大多数人看到这种问题时,他们会想“哦,使用委托(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/