我的应用程序可能需要一段时间才能连接到数据库。这个连接是通过一个库函数调用完成的,也就是说,我不能在那里放置进度更新并进行回调或类似的事情。如何在单独的线程中使用进度条创建MFC对话框?
我的想法是在连接到数据库之前,在单独的线程中创建一个带有进度条的对话框。此对话框将不断更改CProgressCtrl::StepIt()
的进度状态,以便用户看到发生的事情。
之后,对话框设置和做它的事情我想从主线程调用数据库连接功能。 连接功能完成后,我想停止进度条线程。
让我画一幅画:
CMyApp:: ProgressThread
InitInstance() .
| .
| .
+-Create Dialog-+
| |
| Animate
Connect Progress
to Bar
DB |
| |
+-Destroy Dlg---+
| .
| .
这可能吗?如果是,如何?
也许整个事情也会使用定时器。可能会简单得多,但我也无法让它工作。
- 我知道
CProgressCtrl::SetMarquee()
这可能正是我所需要的,但我不能使用它,因为应用程序没有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 .
| .
+1为图 – 2009-11-03 19:52:12
您可以在ANSI应用程序调用SetMarquee(),但它不会帮你,因为是动画进度条的计时器被称为主线程也 – 2009-11-03 19:55:25
在我afxcmn上。h看起来像这样: ** if(_WIN32_WINNT> = 0x0501)&& defined(UNICODE)\ n BOOL SetMarquee(_In_ BOOL fMarqueeMode,_In_ int nInterval); \ n #endif \t // _WIN32_WINNT> = 0x0501 && defined(UNICODE)\ n ** 这就是为什么我不能调用它。 – foraidt 2009-11-04 08:46:08