2009-08-13 68 views
2

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

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

这是一个合理的路要走吗?如果是这样,我该如何更新线程中的状态栏?也许有更聪明的方法来实现这一目标?

回答

3

声明的方法一样,改变给定字符串的状态文本:

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

,并从其他线程,使用Invoke

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

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

+0

谢谢你的帮助。但是,首先编译器抱怨Form1:UpdateStatus无法访问Fomr1的私有成员。这是通过更改为public来解决的:void UpdateStatus(String^msg)。但是,编译器仍然抱怨错误C2440和错误C3754(都在msdn上)。对此有何建议? – 2009-08-14 09:27:25

+0

你是否用实际的类名称替换了“Form1”?你是在表单类本身还是在其他地方添加这两种方法(我认为将这些片段添加到表单类本身)?我只是在VS2008中测试了它,它工作。 – 2009-08-14 10:27:11

+0

我从Form1创建另一个类的实例。所以当Form1加载时,我创建了一个B类的实例。在B类的EntryPoint中,我执行了一些耗时的操作。它是这样的:我通过创建一个名为b的类B的实例,从Form1开始一个线程,并执行b - > Start();当b完成耗时的操作时,我想更改Form1中成员statusBar中的文本。我希望这能够澄清我想要做的事情。再次,我真的非常感谢你在这个时候帮助我! – 2009-08-15 14:47:27