【问题标题】:Visual C++ (CLI) ThreadingVisual C++ (CLI) 线程
【发布时间】:2011-08-09 18:59:06
【问题描述】:

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

【问题讨论】:

  • 完全改变你的问题是不合适的。如有必要,开始一个新的。
  • @Brian:即使问题可能已经改变,你的回答仍然是正确的。
  • @Ben:是的...我没注意到_txt-&gt;AppendText 还在那里。
  • @Brian:我看到汉斯把它放回到原来的问题上。但是更新有_txt-&gt;Text = ...,这也违反了.NET对其他线程的GUI访问的限制。

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


【解决方案1】:

我将强调编译错误,因为 C++\CLI 对我来说不是一种熟悉的语言。不过,我可以提另一个问题。

您正试图从非 UI 线程访问 UI 控件。您不能从工作线程或除主 UI 线程之外的任何其他线程以任何形式或形式(甚至只是读取属性)触摸 _txt。您可以做的是将委托的执行编组回 UI 线程,然后您可以更改Text 属性或调用AppendText。要将委托编组到 UI 线程上,请使用 _text-&gt;Invoke

【讨论】:

    【解决方案2】:

    如果Form1::calculate() 是非静态的,您需要提供应该运行该函数的对象,在您的情况下可能是this。您还会遇到 calculate 接受参数的问题 - ThreadStart 委托确实是无参数的。

    MSDNThreadStart 的文档中有一个示例可能值得一看。

    这是来自 MSDN 的非静态 ThreadStart 委托的示例代码:

    Work^ w = gcnew Work;
    w->Data = 42;
    ThreadStart^ threadDelegate = gcnew ThreadStart( w, &Work::DoMoreWork );
    Thread^ newThread = gcnew Thread( threadDelegate );
    newThread->Start();
    

    【讨论】:

    • 谢谢,我已经更新了我的问题(请参见上文)你知道为什么会这样吗?
    猜你喜欢
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多