关于线程的三个问题,请诸位大神指教
各位大侠,线程分工作线程和用户界面线程,工作线程主要是干一些耗时的计算或功能相对独立的处理比如说串口开发时可能需要有一个线程去不停的查询串口的连接状态等。工作线程我用过很多次了,确实挺方便的,只要解决好线程间的同步及通讯问题,可以显著地提高运行效率。但是在这儿我想问一下,工作者线程是在哪儿创建呢?假如我在一个对话框类中创建后,会不会应为这个对话框的销毁,线程也销毁呢?如何保证对话框的销毁不影响线程的工作呢?
至于用户界面线程我在做项目时从来没用过,我知道该怎么实现,可是就是搞不懂究竟该什么时候才考虑使用用户界面线程,既然主线程就是一个用户界面线程,那为什么还需要在程序中再创建一个用户界面线程呢?另外,在那些具体的情况下使用用户界面线程呢?请举一个简单的例子
另外,定时器函数和线程有什么区别吗?我感觉某些线程可以实现的功能,定时器函数就可以实现了。
请大侠指教啊
[解决办法]
会不会应为这个对话框的销毁,线程也销毁呢?
不会的
定时器函数和线程有什么区别吗?
timer是消息驱动的
[解决办法]
1.在App中启动线程,InitInstance函数中
2.用户界面线程,自己开个线程,建立一个窗口。模态对话框又想控制其他窗口时就需要使用这个
3.区别很大,的确可以实现一部分的功能。但是SetTimer是中断技术。计时的时候是类似的功能,最后时间到了还是触发WM_TIME消息走消息队列调用回调函数的。这时候还是主线程在干活。多线程就不一样了。
[解决办法]
对话框也是运行在线程中的,如果对话框是主窗口,那么对话框正常退出,主线程正常退出,进程结束,子线程自然也会结束,除了这种情况外,对话框退出跟子线程结束否没有一毛钱关系。简短的说2个线程是独立的,互不影响,不会说A线程结束就会导致B线程结束,除非A线程是主线程,而起B线程是在主线程里创建的。
UI线程一个好处就是可以响应线程消息,一个word线程是顺序执行的,除非你使用goto这种语法,而且执行完线程就结束了,UI线程你不去主动结束,线程是一直在的。UI线程虽然比work线程占用多点资源,但某些时候还是很方便的。
定时器处理函数还是运行在本线程的,不信可以用GetCurrentThreadID对比下,比如主线程开个定时器,去运行复杂的计算,你的UI会卡死。定时器跟线程貌似没多大相同的吧
[解决办法]
不管什么线程,最终都是调用createthread来创建,MFC里创建线程一般用AfxBgeinthread,这个函数稍微封装了下,内部当然还是createthread来创建线程。应用程序APP是另一回事,用MFC生成的框架,不论是单文档多文档还是对话框,都有一个APP类,这个类从CWinThread派生,而CWinthread就是一个线程内,内部启动了一个线程,有消息循环。
要启动一个工作线程直接调用函数就是了,线程的执行当然是从线程函数开始执行,线程函数自己写。
如果某个对话框需要一个线程,就开辟一个,那么另一个对话框需要另外一个线程就又启动一个?
------------
如果同时需要那没办法,直接创建,如果不是同时需要可以用UI线程,如果觉得分散不好管理,可以用线程池,不过客户端程序一般比较少用这个,大多数是服务器程序会用到线程池。