我正在使用带有CLI的Visual C ++ 2008。我有一个带有文本框和按钮的表单,一旦按下按钮,我想要输出以下代码,如下所示:
private:
System::Void button_Click(System::Object^ sender, System::EventArgs^ e) {
Thread ^thr1 = gcnew Thread(gcnew ThreadStart(&Form1::calculate("t1")));
Thread ^thr2 = gcnew Thread(gcnew ThreadStart(&Form1::calculate("t2")));
thr1->Start();
thr2->Start();
}
void calculate(String^ val) {
int j;
for(j=0; j<10; j++)
_txt->AppendText(val + Convert::ToString(j) + "\n");
}
期望的输出:
t1 0
t2 0
t1 1
t2 1
等...
上面的代码不起作用。说明代表需要在gcnew Thead行输入两个输入。我究竟做错了什么?还有更好的方法来实现这个目标吗?
答案 0 :(得分:2)
我会解决编译错误,因为C ++ \ CLI对我来说不是一种熟悉的语言。但是,我可以提到另一个问题。
您正在尝试从非UI线程访问UI控件。您不能以任何形式或形式(甚至只是读取属性)从工作线程或除主UI线程之外的任何其他线程触摸_txt
。您可以做的是将委托的执行封送回UI线程,然后您可以更改Text
属性或调用AppendText
。要将委托编组到UI线程上,请使用_text->Invoke
。
答案 1 :(得分:1)
如果Form1::calculate()
是非静态的,则需要提供应该运行该函数的对象,可能是this
。您还将遇到calculate
接受参数的问题 - ThreadStart
委托所做的是无参数的。
ThreadStart
的{{3}}文档中有一个例子可能值得一看。
这是来自MSDN的非静态ThreadStart
代理的示例代码:
Work^ w = gcnew Work;
w->Data = 42;
ThreadStart^ threadDelegate = gcnew ThreadStart( w, &Work::DoMoreWork );
Thread^ newThread = gcnew Thread( threadDelegate );
newThread->Start();