工作者线程和用户界面线程
RT,小弟做一个的软件,其中有一些工作者线程要进行大量的运算,我想通过界面线程来展示其进度.以下是我的步骤:1,派生CWinThread类CUIThread;2,然后建立...
RT,小弟做一个的软件,其中有一些工作者线程要进行大量的运算,我想通过界面线程来展示其进度.
以下是我的步骤:
1,派生CWinThread类 CUIThread;
2,然后建立一个对话框 IDD_UITHREADDLG,放一个进度条,并建立一个类CUIThreadDlg与之关联;
3,在CUIThread的申明CUIThreadDlg对象m_uiDlg,InitInstance函数中初始化m_uiDlg相关的信息,如进度条和m_uiDlg.showWindow(SW_SHOW),等等;
4,自定义消息,WM_UIPROCESS,处理进度条显示;
5,在主线程(工作者线程)中CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CUIThread)),然后再一定的时候发送消息pThread->PostThreadMessage(WM_UIPROCESS,i,j);
运行结束的时候发送消息:pThread->PostThreadMessage(WM_QUIT,NULL,NULL);
问题是,主线程运算完毕之后(大概10多秒),界面才弹出来闪一下,没了.
我的意思是,如何使得工作者线程再运算的时候,窗口就显示出来,而且我这样做貌似是等工作者线程运算完毕之后才管界面线程.
哪位大哥指教一下,小弟感激不尽!
各位,不好意思, 我的意思是说, 如果不发送pThread->PostThreadMessage(WM_QUIT,NULL,NULL);
效果是,工作线程计算完了,界面才出来,而且进度一下就是100%,看不到从0%~100%的那个过程,
我就是想知道,该怎么来实现,工作线程在计算之初界面就出来,可以让我看到界面从0%~100%的这个过程, 展开
以下是我的步骤:
1,派生CWinThread类 CUIThread;
2,然后建立一个对话框 IDD_UITHREADDLG,放一个进度条,并建立一个类CUIThreadDlg与之关联;
3,在CUIThread的申明CUIThreadDlg对象m_uiDlg,InitInstance函数中初始化m_uiDlg相关的信息,如进度条和m_uiDlg.showWindow(SW_SHOW),等等;
4,自定义消息,WM_UIPROCESS,处理进度条显示;
5,在主线程(工作者线程)中CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CUIThread)),然后再一定的时候发送消息pThread->PostThreadMessage(WM_UIPROCESS,i,j);
运行结束的时候发送消息:pThread->PostThreadMessage(WM_QUIT,NULL,NULL);
问题是,主线程运算完毕之后(大概10多秒),界面才弹出来闪一下,没了.
我的意思是,如何使得工作者线程再运算的时候,窗口就显示出来,而且我这样做貌似是等工作者线程运算完毕之后才管界面线程.
哪位大哥指教一下,小弟感激不尽!
各位,不好意思, 我的意思是说, 如果不发送pThread->PostThreadMessage(WM_QUIT,NULL,NULL);
效果是,工作线程计算完了,界面才出来,而且进度一下就是100%,看不到从0%~100%的那个过程,
我就是想知道,该怎么来实现,工作线程在计算之初界面就出来,可以让我看到界面从0%~100%的这个过程, 展开
4个回答
展开全部
1)界面最好是放在一个线程中进行统一管理。
2)界面最好让主线程来管理
3)在MFC中,如果主界面收到WM_QUIT,即意味着要关闭窗口,那么主线程也就退出/返回/return了。
4)主线程退出,其他辅助线程不管有没有执行完成,都会因为主线程的退出而退出,主线程退出也就意味着进程结束了。
楼主说的还不够精确。
我的理解是:
工作线程进行计算,主线程的主界面不负责显示工作进度,只要有工作线程,主界面应该创建一个界面来显示工作线程的工作进度,如果工作线程完成了,进度显示界面也应该消失。
如果是这样的逻辑,可以这样布局:
1)专门定义一个进度界面的窗口类,为了能与工作线程进行交流,需要为这个进度界面窗口类定制各种自定义消息,并且该类的窗口实例应该作为主界面的子窗口,这样做是当主界面被关闭,作为子窗口也会被关闭。
2)工作线程应该由主界面创建,进度界面也由主界面创建。
3)工作线程汇报工作进度,主界面不干预,汇报工作直接在工作线程与进度界面之间通过自定义消息实现。
4)工作线程需要return前给主界面发送即将完成消息。
5)所有线程都有“完成信号”状态,即线程在运行时,处于无信号状态,线程完成退出,处于有信号状态。不熟悉可以看下“系统编程”有关内容。利用该特性,主线程在收到工作线程发来的即将完成消息后,调用WaitForSingleObject,将自己临时阻塞,阻塞会造成主界面无法响应用户鼠标键盘消息,形成假死状态。但这种情况几乎看不到。主线程收到工作线程消息才调用WaitForSingleObject,才会阻塞,但工作线程这个时候基本上已经退出了,因此WaitForSingleObject几乎没有等待就返回了,因此主界面被阻塞的估计值是小于1秒钟。即使是最坏的情况下,多个工作线程同时完成,主界面需要依次调用WaitForSingleObject,也不会有问题。
6)WaitForSingleObject返回了,标志工作线程结束工作,主界面就可以安全地关闭进度界面窗口。
2)界面最好让主线程来管理
3)在MFC中,如果主界面收到WM_QUIT,即意味着要关闭窗口,那么主线程也就退出/返回/return了。
4)主线程退出,其他辅助线程不管有没有执行完成,都会因为主线程的退出而退出,主线程退出也就意味着进程结束了。
楼主说的还不够精确。
我的理解是:
工作线程进行计算,主线程的主界面不负责显示工作进度,只要有工作线程,主界面应该创建一个界面来显示工作线程的工作进度,如果工作线程完成了,进度显示界面也应该消失。
如果是这样的逻辑,可以这样布局:
1)专门定义一个进度界面的窗口类,为了能与工作线程进行交流,需要为这个进度界面窗口类定制各种自定义消息,并且该类的窗口实例应该作为主界面的子窗口,这样做是当主界面被关闭,作为子窗口也会被关闭。
2)工作线程应该由主界面创建,进度界面也由主界面创建。
3)工作线程汇报工作进度,主界面不干预,汇报工作直接在工作线程与进度界面之间通过自定义消息实现。
4)工作线程需要return前给主界面发送即将完成消息。
5)所有线程都有“完成信号”状态,即线程在运行时,处于无信号状态,线程完成退出,处于有信号状态。不熟悉可以看下“系统编程”有关内容。利用该特性,主线程在收到工作线程发来的即将完成消息后,调用WaitForSingleObject,将自己临时阻塞,阻塞会造成主界面无法响应用户鼠标键盘消息,形成假死状态。但这种情况几乎看不到。主线程收到工作线程消息才调用WaitForSingleObject,才会阻塞,但工作线程这个时候基本上已经退出了,因此WaitForSingleObject几乎没有等待就返回了,因此主界面被阻塞的估计值是小于1秒钟。即使是最坏的情况下,多个工作线程同时完成,主界面需要依次调用WaitForSingleObject,也不会有问题。
6)WaitForSingleObject返回了,标志工作线程结束工作,主界面就可以安全地关闭进度界面窗口。
展开全部
界面线程一般用来做界面的显示。工作者线程就是处理数据的线程。比如窗口一直在等待消息,就需要在工作者线程里等待然后处理。
UI线程有窗口,窗口自建了消息队列。工作者线程初始状态没有自建消息队列。
工作线程和界面线程都可以有消息队列,只不过通常情况下工作线程没有而已,如果工作线程函数里面如果调用了,有关消息的函数,操作系统自动为工作线成创建消息队列。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实根本就没LZ想象的麻烦吧……
界面线程就不要自己弄了,你启动工作者线程的时候,把窗口句柄传递进去,如果还有其他参数就弄个结构体,传个结构体指针进去,这样就行了啊,有了窗口指针,界面想做什么做不到?用主界面的窗口指针获取控件指针GetDlgItem,然后调用控件函数,就直接显示了。
我还保留着一个实例,zlib压缩,开一个工作者线程进行压缩,实时显示压缩率,压缩进度。如果想要的就联系我
界面线程就不要自己弄了,你启动工作者线程的时候,把窗口句柄传递进去,如果还有其他参数就弄个结构体,传个结构体指针进去,这样就行了啊,有了窗口指针,界面想做什么做不到?用主界面的窗口指针获取控件指针GetDlgItem,然后调用控件函数,就直接显示了。
我还保留着一个实例,zlib压缩,开一个工作者线程进行压缩,实时显示压缩率,压缩进度。如果想要的就联系我
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
参与一下子讨论, 我觉得应该考虑如下:
1. 界面应当在主线程中创建与销毁. 就不会出现闪一下子就没有的现象.
2. 工程计算可以准备一个专门的线程进行, 将主线程中建立的界面以指针传给工作线程, 由工作线程在运行的过程中进行维护, 可以很好的进行显示
3. 从介绍的要求来看, 没有太看出来进行同步的必要, 主线程启动了运算线程后等着就可以了, 如果一定要中间退出, 可以直接杀运算线程.
1. 界面应当在主线程中创建与销毁. 就不会出现闪一下子就没有的现象.
2. 工程计算可以准备一个专门的线程进行, 将主线程中建立的界面以指针传给工作线程, 由工作线程在运行的过程中进行维护, 可以很好的进行显示
3. 从介绍的要求来看, 没有太看出来进行同步的必要, 主线程启动了运算线程后等着就可以了, 如果一定要中间退出, 可以直接杀运算线程.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询