我的应用程序可能需要一段时间才能连接到数据库。此连接是通过单个库函数调用建立的,即我无法将进度更新放在那里并进行回调或类似的操作。
我的想法是在连接到数据库之前在单独的线程中创建一个带有进度条的对话框。该对话框将不断更改进度状态CProgressCtrl::StepIt()
所以用户看到发生了一些事情。
设置该对话框并执行其操作后,我想从主线程调用数据库连接函数。
连接功能完成后,我想停止进度条线程。
让我画一张图:
CMyApp:: ProgressThread
InitInstance() .
| .
| .
+-Create Dialog-+
| |
| Animate
Connect Progress
to Bar
DB |
| |
+-Destroy Dlg---+
| .
| .
那可能吗?如果是,怎么办?
也许整个事情也可以使用计时器来完成。可能会简单得多,但我也无法让它发挥作用。
- 我知道
CProgressCtrl::SetMarquee()
这可能完全符合我的需要,但我无法使用它,因为该应用程序不支持 Unicode。
- 我可以将数据库连接调用移至单独的线程中,但这样看起来会对代码进行大量更改,并对连接错误进行额外处理。
Update 2
我按照 AlexEzh 和 Javier De Pedro 建议的方式工作:将数据库内容放入其自己的线程中。
最初我担心如何处理错误,但实际上它与以前非常相似。
- 在主线程中,我创建一个带有连接参数、结果标志和线程运行标志的结构。后者最初设置为
true
.
- 我创建一个线程并将该结构作为参数传递。
- 我创建了一个在主线程中显示进度条的对话框。
- 另外,在主线程中,有一个循环在设置线程运行标志时运行。它调用
CMyDialog::Animate()
哪个调用CProgressCtrl::StepIt()
进而Sleep()
s a bit.
- 该线程执行数据库连接代码并将运行标志设置为
false
完成后。
- 当主线程退出循环时,它可以像以前一样处理错误。
坏处:将鼠标移到窗口上不起作用。它是看不见的。因此,不能使用取消按钮或其他交互式对话框元素。不过,我可以忍受这一点。
既然您喜欢该图,那么它现在的样子如下:
CMyApp:: WorkerThread
InitInstance() .
| .
| .
Create Dialog .
| .
+-Start Thread--+
| |
| Connect
Animate to
Progress DB
Bar |
| |
+-Thread Ends---+
| .
Destroy Dlg .
| .
I hope this http://www.codeproject.com/KB/winsdk/win32splash.aspx关于创建带有进度条的自线程启动屏幕的文章可能会有所帮助。我在解决 MFC 消息队列级别的线程锁定问题时编写了它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)