我的应用程序可能需要一段时间才能连接到数据库.这个连接是用一个库函数调用进行的,即我不能把进度更新放在那里,并进行回调或类似的回调.
我的想法是在连接到数据库之前在单独的线程中创建一个具有进度条的对话框.此对话框将持续更改CProgressCtrl :: StepIt()的进度状态,以便用户看到发生的情况.
在该对话框设置完成之后,我想从主线程调用DB连接功能.
连接功能完成后,我想停止进度条线程.
让我画一张照片:
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 . | .
解决方法
将DB连接逻辑移到单独的线程上仍然更安全.使用对话框线程上的DB,您将能够重新绘制进度条,但不能在对话框中重新绘制其他控件.