我的应用程序可能需要一段时间才能连接到数据库。此连接是通过单个库函数调用建立的,即我无法将进度更新放在那里并进行回调或类似操作。
我的想法是在连接到数据库之前在单独的线程中创建一个带有进度条的对话框。此对话框将使用 CProgressCtrl::StepIt()
不断更改进度状态,以便用户看到正在发生的事情。
在设置该对话框并执行其操作后,我想从主线程调用数据库连接函数。
连接函数完成后,我想停止进度条线程。
让我画一幅画:
CMyApp:: ProgressThread
InitInstance() .
| .
| .
+-Create Dialog-+
| |
| Animate
Connect Progress
to Bar
DB |
| |
+-Destroy Dlg---+
| .
| .
这可能吗?如果是,如何?
也许整个事情也可以使用计时器。可能会简单得多,但我也无法让它工作。
- 我知道
CProgressCtrl::SetMarquee()
可能完全满足我的需要,但我无法使用它,因为该应用程序不支持 Unicode。 - 我可以将数据库连接调用移动到一个单独的线程中,但这样看起来需要对代码进行大量更改并额外处理连接错误。
更新 2
我按照 AlexEzh 和 Javier De Pedro 建议的方式让它工作:将 DB stuf 放入其自己的线程中。
最初我担心如何进行错误处理,但它实际上与以前非常相似。
- 在主线程中,我创建了一个带有连接参数、结果标志和线程运行标志的结构。后者最初设置为
true
。 - 我创建了一个线程并将该结构作为参数传递。
- 我创建了一个在主线程中显示进度条的对话框。
- 在主线程中还有一个循环,在设置线程运行标志时运行。它调用
CMyDialog::Animate()
,后者调用CProgressCtrl::StepIt()
,然后是Sleep()
。 - 线程执行 db-connection 代码并在完成时将 running-flag 设置为
false
。 - 当主线程退出循环时,它可以像以前一样处理错误。
缺点:将鼠标移到窗口上不起作用。它是看不见的。因此不能使用取消按钮或其他交互式对话框元素。不过,我可以接受。
既然你喜欢这个图表,下面是它现在的样子:
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/