c++ - 如何在单独的线程中创建带有进度条的 MFC 对话框?

标签 c++ multithreading mfc dialog progress-bar

我的应用程序可能需要一段时间才能连接到数据库。此连接是通过单个库函数调用建立的,即我无法将进度更新放在那里并进行回调或类似操作。

我的想法是在连接到数据库之前在单独的线程中创建一个带有进度条的对话框。此对话框将使用 CProgressCtrl::StepIt() 不断更改进度状态,以便用户看到正在发生的事情。
在设置该对话框并执行其操作后,我想从主线程调用数据库连接函数。 连接函数完成后,我想停止进度条线程。

让我画一幅画:

CMyApp::       ProgressThread
InitInstance()      .
    |               .
    |               .
    +-Create Dialog-+
    |               |
    |             Animate
 Connect          Progress
    to             Bar
    DB              |
    |               |
    +-Destroy Dlg---+
    |               .
    |               .

这可能吗?如果是,如何?

也许整个事情也可以使用计时器。可能会简单得多,但我也无法让它工作。

  1. 我知道 CProgressCtrl::SetMarquee() 可能完全满足我的需要,但我无法使用它,因为该应用程序不支持 Unicode。
  2. 我可以将数据库连接调用移动到一个单独的线程中,但这样看起来需要对代码进行大量更改并额外处理连接错误。

更新 2
我按照 AlexEzh 和 Javier De Pedro 建议的方式让它工作:将 DB stuf 放入其自己的线程中。
最初我担心如何进行错误处理,但它实际上与以前非常相似。

  1. 在主线程中,我创建了一个带有连接参数、结果标志和线程运行标志的结构。后者最初设置为 true
  2. 我创建了一个线程并将该结构作为参数传递。
  3. 我创建了一个在主线程中显示进度条的对话框。
  4. 在主线程中还有一个循环,在设置线程运行标志时运行。它调用 CMyDialog::Animate(),后者调用 CProgressCtrl::StepIt(),然后是 Sleep()
  5. 线程执行 db-connection 代码并在完成时将 running-flag 设置为 false
  6. 当主线程退出循环时,它可以像以前一样处理错误。

缺点:将鼠标移到窗口上不起作用。它是看不见的。因此不能使用取消按钮或其他交互式对话框元素。不过,我可以接受。

既然你喜欢这个图表,下面是它现在的样子:

CMyApp::        WorkerThread
InitInstance()      .
    |               .
    |               .
Create Dialog       .
    |               .
    +-Start Thread--+
    |               |
    |             Connect
 Animate            to
 Progress           DB
   Bar              |
    |               |
    +-Thread Ends---+
    |               .
 Destroy Dlg        .
    |               .

最佳答案

希望this关于创建带进度条的自有线程启动画面的文章可能会有所帮助。我是在解决MFC消息队列级别的线程锁问题时写的。

关于c++ - 如何在单独的线程中创建带有进度条的 MFC 对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1669017/

相关文章:

java - 不能在 onEnable() 中使用成员变量

c++ - 启动外部应用程序并阻止当前应用程序直到启动的应用程序退出

c++ - 在以下情况下我是否需要使用 wstring

c++ - 如何将QString转换为char **

c++ - C++将对象强制转换为其原始类型

c++ - 父不等待工作线程完成任务

WPF:无法使用命令绑定(bind)和线程控制按钮的启用/禁用状态

mfc - MFC 对话框中的父通知

C++:删除结构?

c++ - 保持从一个函数到另一个函数的流打开