gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:56:40 24 4
gpt4 key购买 nike

现在,我知道当大多数人看到这种问题时,他们会想“哦,使用代表”。好吧,我正在使用代表。这是迄今为止唯一拒绝与他们合作的控件。我也没有使用 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 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com