Как создать диалог 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        .
    |               .

Ответы на вопрос(5)

Ваш ответ на вопрос