多线程DC问题 GDI对象使用多线程是没有意义的,DC对象当被一个线程访问的时候必须禁止别的线程访问,如果多个线程访问一个DC则,必须加同步对象以阻止别的线程访问 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的程序逻辑应该是这样:1. 程序运行, 在主窗口 OnInitDialog 或 OnCreate 里面创建辅助线程, 并把当前的窗口句柄传给辅助线程2. 辅助线程中把你的数据经过计算后, 直接在辅助线程里创建内存dc, 然后把你需要展示的东西绘制到内存dc上3. 内存dc绘制完毕, 锁上同步锁, 然后用 GetDC 的方式获取主窗口的dc, 把内存dc上的内容bitblt到主dc上, 解锁并删除内存dc4. 重复2~3的步骤内存dc也可以在辅助线程外来创建和删除(如果你只有一个辅助线程的话)主线程中的 OnPaint 可以省略了, 因为所有的绘图工作都在辅助线程里进行程序退出需要用 MsgWaitForMultipleObjects 来关闭辅助线程 多线程中使用共享内存本来就有问题。楼主的问题在策略,你线程完全可以在需要绘制时创建一个(New)内存CDC,绘制完毕后将此指针用消息发给主线程处理,处理完成后由主线程释放。 谢谢回复。我的初衷是想在绘制线程绘制的时候,主线程也可以显示一部分memDC中的内容,因此就会出现两个线程同时访问memDC的时候,但是一个线程是单纯的绘制(相当于写),另一个是单纯的显示(相当于读),而不是等绘制线程完全绘制完成后再一次性显示,因为这样有可能要等很长时间,此时使用线程只是避免了界面“卡死”的现象。Windows的SDK应该是不让多个线程同时操作同一个DC,因此只能是让绘制线程完全结束后,主线程再去显示了。 vc保存图片 WndProc函数中switch(msg)里 return 与 break 有什么区别? 请推荐本学习数据库编程的书。 如何实现这种风格的全屏? Dialog 对话框怎样画图,比如画一个圆(菜鸟在线等) MoveTo LineTo 跟的参数不能精确到0.1吗? 急!!关于CRecordset使用: 在动态创建编辑框时如何使其有下沉的效果? 一个smtp的问题 可以在FILE中动态加控件吗? QueryInterface 怎么遍历接口和函数? 【提问】刚开始学win32编程,关于滚动条的有一段代码搞不懂
1. 程序运行, 在主窗口 OnInitDialog 或 OnCreate 里面创建辅助线程, 并把当前的窗口句柄传给辅助线程
2. 辅助线程中把你的数据经过计算后, 直接在辅助线程里创建内存dc, 然后把你需要展示的东西绘制到内存dc上
3. 内存dc绘制完毕, 锁上同步锁, 然后用 GetDC 的方式获取主窗口的dc, 把内存dc上的内容bitblt到主dc上, 解锁并删除内存dc
4. 重复2~3的步骤内存dc也可以在辅助线程外来创建和删除(如果你只有一个辅助线程的话)
主线程中的 OnPaint 可以省略了, 因为所有的绘图工作都在辅助线程里进行
程序退出需要用 MsgWaitForMultipleObjects 来关闭辅助线程
楼主的问题在策略,你线程完全可以在需要绘制时创建一个(New)内存CDC,绘制完毕后将此指针用消息发给主线程处理,处理完成后由主线程释放。
谢谢回复。
我的初衷是想在绘制线程绘制的时候,主线程也可以显示一部分memDC中的内容,因此就会出现两个线程同时访问memDC的时候,但是一个线程是单纯的绘制(相当于写),另一个是单纯的显示(相当于读),而不是等绘制线程完全绘制完成后再一次性显示,因为这样有可能要等很长时间,此时使用线程只是避免了界面“卡死”的现象。Windows的SDK应该是不让多个线程同时操作同一个DC,因此只能是让绘制线程完全结束后,主线程再去显示了。