none
Visual C++ мнопоточность RRS feed

  • Вопрос

  • Здравствуйте. Лежит на форме progressBar и надо в другом потоке по ходу работы задавать новые значения (ход выполнения отображать), но просто сделать progressBar1->Value=X; не получится, " Недопустимая операция в нескольких потоках..." в общем нельзя из другого потока напрямую задавать значения, нашёл кучу статей по-поводу этого, но для C#, а как в Visual C++ быть? Помогите пожалуйста. Спасибо.

Ответы

  • Вам надо объявить сигнатуру делегата и аллокировать его:

    delegate void Invoker(String^ str);

    Invoker^ callback = gcnew Invoker(MyClass::MyFunc);  

    Теперь callback можно передать Control.Invoke()/BeginInvoke().

    Можно так же использовать готовые сигнатуры, например Action<T>.

    Кстати, когда постите уточняйте что вы используйте C++/CLI и Forms.

    К C++ они имеют весьма опосредованное отношение и решшения для них в общем то такие же как для других .Net языков.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    Модератор

Все ответы

  • Послать мессагу на GUI поток и попросить его сделать что надо.

    This posting is provided "AS IS" with no warranties, and confers no rights.

    Модератор
  • в Msdn все примеры на всех языках

    Используйте BackgroundWorked ReportProgress (и событие ProgressChanged) или Control.BeginInvoke

  • Здравствуйте. В мире .NET большой разницы между языками программирования нет (разве что синтаксис у каждого свой). Поэтому механизмы, реализованные в C#, можно применить и в C++/CLI. Метод формы Invoke сделает синхронный вызов некоторого кода (или лямбды) в потоке интерфейса (на это время рабочий поток будет приостановлен). Аналогично, BeginInvoke выполнит те же действия параллельно с рабочим потоком без его прерывания.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

  • Спасибо, посмотрел вашу ссылку по поводу Control.BeginInvoke, там в этот метод передаётся объект типа InvokeDelegate, наверное прозвучит глупо, но я не могу его найти. В каком пространстве имён он находится? Спасибо.

  • Вам надо объявить сигнатуру делегата и аллокировать его:

    delegate void Invoker(String^ str);

    Invoker^ callback = gcnew Invoker(MyClass::MyFunc);  

    Теперь callback можно передать Control.Invoke()/BeginInvoke().

    Можно так же использовать готовые сигнатуры, например Action<T>.

    Кстати, когда постите уточняйте что вы используйте C++/CLI и Forms.

    К C++ они имеют весьма опосредованное отношение и решшения для них в общем то такие же как для других .Net языков.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    Модератор
  • Спасибо огромное! Всё получилось)