Visual Studio C ++ Как заставить форму не зависать при вызове трудоемкой функции? - PullRequest
1 голос
/ 01 июня 2011

Я делаю приложение C ++ / CLI Forms.

В главном окне моего приложения у меня есть кнопка. Когда я нажимаю эту кнопку, я вызываю функцию Load. Ниже приведен код C ++ / CLI:

private: System::Void Button1_Click(System::Object^  sender, System::EventArgs^  e) {
     Load();
}

Функция Load() является трудоемкой функцией. Он использует библиотеку cURL для отправки нескольких HTTP-запросов GET на веб-сайт.

В форму я также включил ProgressBar и textLabel, показывающие текущий отправляемый запрос.

Проблема в том, что когда я нажимаю кнопку и вызываю функцию, форма просто зависает. Я не могу видеть, как progressBar и Textlabel изменяют свое значение, пока вызывается функция Load (), форма просто зависла. Когда функция Load () закончила посылку запроса, внезапно progressBar изменит свое значение на 100%.

Надеюсь, я достаточно четко описал свою проблему, чтобы понять ее.

Ответы [ 4 ]

1 голос
/ 02 июня 2011

Либо разбейте задачу на более мелкие части (спроектируйте конечный автомат или используйте продолжения), либо используйте отдельный поток.

Первый подход требует большего привыкания, но опытному программисту легче понять его. Потоки требуют синхронизации, которая очень ориентирована на детали и вызывает много скрытых спорадических ошибок, которые чрезвычайно трудно отладить.

1 голос
/ 10 августа 2012

Звоните Form1.Refresh() каждый раз, когда вы обновляете элемент формы (скажем, Form1).Это покажет результаты сразу.

1 голос
/ 01 июня 2011

Переместите задачу в другой поток или позвоните Application.DoEvents(); сразу после обновления значения полосы прокрутки.

0 голосов
/ 14 мая 2014

Перед любой строковой командой, выполняющей, вероятно, любое время загрузки ... Напишите:

System::Windows::Forms::Application::DoEvents();
...