Visual C ++ (CLI) Потоки - PullRequest
       2

Visual C ++ (CLI) Потоки

1 голос
/ 09 августа 2011

Я использую Visual C ++ 2008 с CLI.У меня есть форма с текстовым полем и кнопкой, после нажатия кнопки я хочу, чтобы следующий код выводился следующим образом:

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

и т..

Мой код выше не работает.Заявление о том, что i делегат требует двух входных данных в строке gcnew Thead.Что я делаю неправильно?И есть ли лучший способ добиться этого?

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Я остановлюсь на ошибке компиляции, поскольку C ++ \ CLI не является для меня знакомым языком. Однако могу упомянуть еще одну проблему.

Вы пытаетесь получить доступ к элементу управления пользовательского интерфейса из потока, не являющегося пользовательским интерфейсом. Вы не можете касаться _txt любой формы или формы (даже просто читая свойство) из рабочего потока или любого другого потока, кроме основного потока пользовательского интерфейса. Что вы можете сделать, так это перенаправить выполнение делегата обратно в поток пользовательского интерфейса, после чего вы можете изменить свойство Text или вызвать AppendText. Чтобы направить делегата в поток пользовательского интерфейса, используйте _text->Invoke.

1 голос
/ 09 августа 2011

Если Form1::calculate() не является статичным, вам нужно указать объект, на котором должна выполняться функция, вероятно, this в вашем случае. Вы также столкнетесь с проблемами, которые calculate принимает аргумент - делегат ThreadStart не имеет параметров.

Есть пример в MSDN документации для ThreadStart, который, вероятно, стоит посмотреть.

Это пример кода из MSDN для нестатического ThreadStart делегата:

Work^ w = gcnew Work;
w->Data = 42;
ThreadStart^ threadDelegate = gcnew ThreadStart( w, &Work::DoMoreWork );
Thread^ newThread = gcnew Thread( threadDelegate );
newThread->Start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...