Как создать диалог MFC с индикатором выполнения в отдельном потоке?
Мое приложение может занять некоторое время для подключения к базе данных. Это соединение устанавливается с помощью одного вызова библиотечной функции, то есть я не могу помещать туда обновления прогресса и делать обратные вызовы или что-то подобное.
Моя идея состояла в том, чтобы создать диалог с индикатором выполнения в отдельном потоке перед подключением к БД. Этот диалог будет постоянно менять статус прогресса сCProgressCtrl::StepIt()
пользователь видит, что что-то происходит.
После того, как этот диалог настроен и делает свое дело, я хочу вызвать функцию соединения с БД из основного потока. После завершения функции подключения я хочу остановить поток выполнения индикатора.
Позвольте мне нарисовать картину:
CMyApp:: ProgressThread
InitInstance() .
| .
| .
+-Create Dialog-+
| |
| Animate
Connect Progress
to Bar
DB |
| |
+-Destroy Dlg---+
| .
| .
Это возможно? Если да, то как?
Может быть, все это будет работать с использованием таймеров тоже. Возможно, было бы намного проще, но я не могчтобы это тоже сработало.
Я в курсеCProgressCtrl::SetMarquee()
который может делать именно то, что мне нужно, но я могуt использовать его, потому что приложение не поддерживает Unicode.Я мог бы переместить вызов соединения db в отдельный поток, но таким образом это выглядит как множество изменений в коде и дополнительная обработка ошибок соединения.Обновление 2
У меня все получилось так, как предложили AlexEzh и Хавьер Де Педро: Поместите базу данных DB в собственный поток.
Первоначально у меня были проблемы с обработкой ошибок, но этона самом деле очень похоже на то, как это было раньше.
true
Я создаю поток и передаю эту структуру в качестве параметра.Я создаю диалог, который отображает индикатор выполнения в главном потоке.Также в основном потоке есть цикл, который выполняется, пока установлен флаг выполнения потока. Это вызываетCMyDialog::Animate()
какие звонкиCProgressCtrl::StepIt()
а потомSleep()
немного.Поток выполняет код db-соединения и устанавливает флаг работы вfalse
когда сделано.Когда основной поток выходит из цикла, он может обрабатывать ошибки точно так же, как и раньше.Недостаток: Перемещение мыши над окном нет работа. Это'с невидимым. Таким образом, кнопка отмены или другие элементы интерактивного диалога не могут быть использованы. Я могу жить с этим, однако.
Поскольку вам понравилась диаграмма, вот как она выглядит сейчас:
CMyApp:: WorkerThread
InitInstance() .
| .
| .
Create Dialog .
| .
+-Start Thread--+
| |
| Connect
Animate to
Progress DB
Bar |
| |
+-Thread Ends---+
| .
Destroy Dlg .
| .