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

for*_*idt 9 c++ mfc multithreading dialog progress-bar

我的应用程序可能需要一段时间才能连接到数据库.这个连接使用单个库函数调用,即我不能在其中放入进度更新并进行回调或类似的操作.

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

让我画一幅画:

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

那可能吗?如果有,怎么样?

也许整个事情也可以使用计时器.可能会简单得多,但我也无法做到这一点.

  1. 我知道CProgressCtrl::SetMarquee()哪些可能正是我需要的但我无法使用它因为应用程序没有Unicode支持.
  2. 我可以将数据库连接调用移动到一个单独的线程中,但这样看起来像代码的大量更改和连接错误的额外处理.

更新2
我得到它的方式AlexEzh和Javier De Pedro建议:将DB stuf放入自己的线程.
最初我担心如何处理错误,但它实际上与之前的情况非常相似.

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

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

既然您喜欢这个图表,现​​在的样子如下:

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

Kir*_*sky 7

我希望文章有关与进度条创建自己的线程启动画面可能会有所帮助.我在解决MFC消息队列级别的线程锁定问题时编写了它.


Ale*_*Ezh 2

将数据库连接逻辑移至单独的线程仍然会更安全。通过对话框线程上的数据库,您将能够重新绘制进度条,但不能重新绘制对话框中的其他控件。