GDI和多线程

BlueTrees 2006-08-11 04:03:24
GDI是指Windows的图形化界面开发接口,它包括一组对象和一套API。主要有,窗口、设备描述附表、位图、区域、笔刷等等。

为了效率的缘故,访问GDI对象并没有序列化,因此,从理论上说GDI不是线程安全的,它不能允许多个线程“同时”操作一个GDI对象。

通常的程序结构是单线程的,只有一个线程在使用GDI对象,我们称这个线程是主线程,在单线程程序扩展为多线程的时候,一般不允许其他线程直接访问GDI,因为,是我们的主线程创建了各种GDI对象,主线程创建了窗口接收用户输入,而不是其他线程创建的。那么,其他线程需要使用GDI对象向用户输出时怎么处理呢?通常通过某些方法通知主线程去处理显示。最常用的方法是,使用Windows的消息系统通知主线程,其他线程可以向主线程的窗口发送一个自定义的消息来通知主线程显示一些内容。

如果,你在一个DLL中如何向主线程发送自定义消息呢?特别是主程序不是你开发的,并不知道你的自定义消息的格式,这时候怎么处理呢?

如果,主程序可以是约定的,那么可以把自定义消息加入文档中提示开发主程序的程序员处理,这种方式不是很好。
最好的方式,是在DLL的引出函数中提供一些等待和同步的函数,同步函数,通常使用回调函数,你提供一个方法,让主程序设置他自己定义的回调函数,然后你需要主程序做一些事情的时候可以调用这个回调函数,当然这是在你的线程中的,在回调函数中,开发主程序的程序员会用自己的办法来通知主线程。这种方式是最灵活的方式。

...全文
796 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
guinh3 2006-10-05
  • 打赏
  • 举报
回复
在MFC内,有工作者线程和界面线程,其中界面线程中其实也就是比工作者线程多了一个消息循环,可在界面线程内的初始化实例函数中创建对话框,或者文档视图,这样整个GDI界面就可由独立的消息循环来处理了,在这种情况下每个线程可独立的处理GDI。当然对于同一个GDI对象的访问最好不要使用SendMessage而应该使用PostMessage,因为第一个同步,而第二个是异步的,使用PostMessage时要求其参数传递的对象为全局对象,或堆中的变量,不能使用局部变量。

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧