Используйте backgroundworker в VC ++ 2010 - PullRequest
0 голосов
/ 03 февраля 2011

Я хочу сделать программу, которая архивирует файлы резервных копий, но программа зависает при архивировании файлов.Я пытался использовать backgroundworker для выполнения работы.

Это мой код:

private: System::Void threadTest_Click(System::Object^  sender, System::EventArgs^  e) {
         debug->Text = L"Zipping...";
         zip->RunWorkerAsync();
         if(zip->IsBusy)
         {
            bkProgress->Increment(20);
            Application::DoEvents();
         }
         //zip->OnDoWork();
     }

Это DoWork код для моего backgroundworker:

private: System::Void zip_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
            //zipping file code here
            refreshAll();
     }

Я обнаружил, что refreshAll() не будет работать, и я не могу сказать, когда поток остановлен, я думаю, что сделал что-то не так, вы можете дать мне несколько советов, я действительно новичок в CLR.Спасибо

Ответы [ 2 ]

3 голосов
/ 03 февраля 2011

если RefreshAll вносит изменения в графический интерфейс, вы должны соблюдать следующее правило:

Никогда не изменяйте графический интерфейс из потока, отличного от основного потока, в котором был создан графический интерфейс.

ВВ этом случае вам необходимо использовать метод Form :: Invoke для переключения на основной поток, подобный этому

this->Invoke(gcnew RefreshAllDelegate(), new Object[] { message });

И, конечно, вам необходимо создать делегат RefreshAllDelegate.

1 голос
/ 03 февраля 2011

Удалите весь код после RunWorkerAsync (), это приведет к аварийному завершению работы вашего приложения только тогда, когда пользователь закроет форму во время выполнения архивирования.В методе DoWork () используйте метод ReportProgress () bgw, чтобы сообщить о прогрессе.Вы можете написать обработчик события для обновления пользовательского интерфейса.Переместите refreshAll () в обработчик событий RunWorkerCompleted bgw.

Просмотрите примеры, приведенные в статье библиотеки MSDN для BackgroundWorker.BGW был разработан, чтобы упростить многопоточность с пользовательским интерфейсом, но если вы используете его неправильно, вы просто купите много горя.Сначала попрактикуйтесь с примерами, прежде чем заставить его работать в своем собственном коде.

...