【问题标题】:Update statusbar from a thread using C++/CLI使用 C++/CLI 从线程更新状态栏
【发布时间】:2010-11-19 07:58:10
【问题描述】:

我确信这是一个非常直接的问题。我正在使用 C++/CLI 编写一个小型 Windows 窗体应用程序。当表单初始化时,我启动一个线程来处理一些代码。当线程中的代码被执行时,我希望线程以某种方式更新窗口底部状态栏中的文本。所以我在想这样的事情:

  1. 我创建了一个事件。
  2. 然后我创建将进行一些处理的线程。
  3. 处理完成后,触发一个事件,使状态栏中的文本更新。

这是一个合理的方法吗?如果是这样,我如何从线程内更新状态栏?也许有更聪明的方法来实现这一点?

【问题讨论】:

    标签: multithreading winforms c++-cli


    【解决方案1】:

    声明一个类似的方法来改变给定字符串的状态文本:

    private: void UpdateStatus(String^ msg) {
        statusBar.Text = msg;
    }
    

    在另一个线程中,使用Invoke:

    Invoke(gcnew Action<String^>(this, &Form1::UpdateStatus), "message");
    

    Invoke 将在 UI 线程上使用指定参数调用给定委托。

    【讨论】:

    • 感谢您的帮助。但是,首先编译器抱怨 Form1:UpdateStatus 无法访问 Formr1 的私有成员。这已通过更改为 public 来解决:void UpdateStatus(String^ msg)。但是,编译器仍然抱怨错误 C2440 和错误 C3754(两者都在 msdn 上)。对此有何建议?
    • 您是否将Form1 替换为实际的类名?您是在表单类本身中添加这两种方法,还是在其他地方(我假设将这些 sn-ps 添加到表单类本身)?我刚刚在 VS2008 中对此进行了测试,它可以工作。
    • 我从 Form1 创建另一个类的实例。因此,当 Form1 加载时,我创建了一个 B 类的实例。在 B 类的 EntryPoint 中,我执行了一些耗时的操作。它是这样的:我通过创建一个名为 b 的类 B 的实例从 Form1 启动一个线程,然后执行 b -> Start();当 b 完成耗时的操作后,我想更改作为 Form1 成员的 statusBar 中的文本。我希望这能澄清我正在尝试做的事情。再一次,我真的很感谢你花时间来帮助我!
    • 为什么不使用BackgroundWorker 类?它旨在完成这项工作:msdn.microsoft.com/en-us/library/…
    • BackgroundWorker 完成了这项工作!我确信必须有一个简单的解决方案来解决这个问题,因为在后台做一些更新状态栏的工作一定很常见,但我对此很陌生,我的知识非常有限。非常感谢您对此的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2011-06-09
    • 2014-06-28
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    相关资源
    最近更新 更多