GDI对象使用多线程是没有意义的,DC对象当被一个线程访问的时候必须禁止别的线程访问,如果多个线程访问一个DC则,必须加同步对象以阻止别的线程访问

解决方案 »

  1.   

    你的程序逻辑应该是这样:
    1. 程序运行, 在主窗口 OnInitDialog 或 OnCreate 里面创建辅助线程, 并把当前的窗口句柄传给辅助线程
    2. 辅助线程中把你的数据经过计算后, 直接在辅助线程里创建内存dc, 然后把你需要展示的东西绘制到内存dc上
    3. 内存dc绘制完毕, 锁上同步锁, 然后用 GetDC 的方式获取主窗口的dc, 把内存dc上的内容bitblt到主dc上, 解锁并删除内存dc
    4. 重复2~3的步骤内存dc也可以在辅助线程外来创建和删除(如果你只有一个辅助线程的话)
    主线程中的 OnPaint 可以省略了, 因为所有的绘图工作都在辅助线程里进行
    程序退出需要用 MsgWaitForMultipleObjects  来关闭辅助线程
      

  2.   

    多线程中使用共享内存本来就有问题。
    楼主的问题在策略,你线程完全可以在需要绘制时创建一个(New)内存CDC,绘制完毕后将此指针用消息发给主线程处理,处理完成后由主线程释放。
      

  3.   


    谢谢回复。
    我的初衷是想在绘制线程绘制的时候,主线程也可以显示一部分memDC中的内容,因此就会出现两个线程同时访问memDC的时候,但是一个线程是单纯的绘制(相当于写),另一个是单纯的显示(相当于读),而不是等绘制线程完全绘制完成后再一次性显示,因为这样有可能要等很长时间,此时使用线程只是避免了界面“卡死”的现象。Windows的SDK应该是不让多个线程同时操作同一个DC,因此只能是让绘制线程完全结束后,主线程再去显示了。