GDI和多线程
GDI是指Windows的图形化界面开发接口,它包括一组对象和一套API。主要有,窗口、设备描述附表、位图、区域、笔刷等等。
为了效率的缘故,访问GDI对象并没有序列化,因此,从理论上说GDI不是线程安全的,它不能允许多个线程“同时”操作一个GDI对象。
通常的程序结构是单线程的,只有一个线程在使用GDI对象,我们称这个线程是主线程,在单线程程序扩展为多线程的时候,一般不允许其他线程直接访问GDI,因为,是我们的主线程创建了各种GDI对象,主线程创建了窗口接收用户输入,而不是其他线程创建的。那么,其他线程需要使用GDI对象向用户输出时怎么处理呢?通常通过某些方法通知主线程去处理显示。最常用的方法是,使用Windows的消息系统通知主线程,其他线程可以向主线程的窗口发送一个自定义的消息来通知主线程显示一些内容。
如果,你在一个DLL中如何向主线程发送自定义消息呢?特别是主程序不是你开发的,并不知道你的自定义消息的格式,这时候怎么处理呢?
如果,主程序可以是约定的,那么可以把自定义消息加入文档中提示开发主程序的程序员处理,这种方式不是很好。
最好的方式,是在DLL的引出函数中提供一些等待和同步的函数,同步函数,通常使用回调函数,你提供一个方法,让主程序设置他自己定义的回调函数,然后你需要主程序做一些事情的时候可以调用这个回调函数,当然这是在你的线程中的,在回调函数中,开发主程序的程序员会用自己的办法来通知主线程。这种方式是最灵活的方式。