Visual C ++(CLI)线程

时间:2011-08-09 18:59:07

标签: multithreading visual-c++ c++-cli

我正在使用带有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行输入两个输入。我究竟做错了什么?还有更好的方法来实现这个目标吗?

2 个答案:

答案 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();