GDI+多线程

阿灿2007 2016-09-26 08:19:41
两个线程,每个线程的功能是分别在主界面画图
 HDC hdc1	= GetDC()->m_hDC;
GraphSin = ::new Graphics(hdc1);
GraphAdvice = ::new Graphics(hdc1);

thread1{
DisplaySinCurve(GraphSin);
}

thread2{
DisplayAdvice(GraphSin);
}

DisplaySinCurve(Graphics* WorkGraphics){
Bitmap* CompatibleBitmap = ::new Bitmap(500, 250);
Graphics* CompatibleGraphic = ::new Graphics(CompatibleBitmap);
// 画图操作
// 双缓冲把图贴到主界面
WorkGraphics->DrawImage(CompatibleBitmap, m_destStatic_Advice,
0, 0, CompatibleBitmap->GetWidth(), CompatibleBitmap->GetHeight(), UnitPixel);
}

DisplayAdvice(Graphics* WorkGraphics){
Bitmap* CompatibleBitmap = ::new Bitmap(500, 250);
Graphics* CompatibleGraphic = ::new Graphics(CompatibleBitmap);
// 画图操作
// 双缓冲把图贴到主界面
WorkGraphics->DrawImage(CompatibleBitmap, m_destStaticRect_Sin, 0, 0, CompatibleBitmap->GetWidth(), CompatibleBitmap->GetHeight(), UnitPixel);
}

问题是运行其中一个线程画图没有任何问题,两个都运行后,出现了前面画上去的东西刷不掉的问题(有重影),请大牛解决。
...全文
620 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-10-10
  • 打赏
  • 举报
回复
引用 6 楼 u011250543 的回复:
自己顶一下,没有大神能回复么?
5楼大神已经回复过了。
OnTheWay_Boy 2016-10-10
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
[quote=引用 6 楼 u011250543 的回复:] 自己顶一下,没有大神能回复么?
5楼大神已经回复过了。[/quote] 调皮的赵四老师
OnTheWay_Boy 2016-10-09
  • 打赏
  • 举报
回复
引用 8 楼 xiaohuh421 的回复:
你每个线程绘制的东西会重在一起, 那肯定就会出现这样的情况了. 正确的做法, 是把耗时间的绘制放到线程中,并绘制到缓冲区中, 再由UI线程把它们全部绘制到界面上. 而不是每个线程都在直接操作设备DC来绘制.
up
xiaohuh421 2016-10-09
  • 打赏
  • 举报
回复
你每个线程绘制的东西会重在一起, 那肯定就会出现这样的情况了. 正确的做法, 是把耗时间的绘制放到线程中,并绘制到缓冲区中, 再由UI线程把它们全部绘制到界面上. 而不是每个线程都在直接操作设备DC来绘制.
wlj1234 2016-10-09
  • 打赏
  • 举报
回复
个人感觉两个线程应该共同操作同一缓存(Bitmap* CompatibleBitmap),而不是两个块缓存。 重影原因有可能是当两块缓存同时向前台同一设备分别执行DrawImage() 以上仅是猜测,底层是不是这样执行的就不得而知了
阿灿2007 2016-10-09
  • 打赏
  • 举报
回复
自己顶一下,没有大神能回复么?
赵4老师 2016-09-27
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
阿灿2007 2016-09-26
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
建议只在一个线程中绘制, 容易控制 onDraw() { if(fb) { } //填充背景 if(f1) { draw1(); } if(f2) { draw2(); } if(fn) { drawn(); } }
单线程也可以,我比较想知道这样为什么会出错。。 单线程如果几个画图函数一起执行速度会变慢吧
阿灿2007 2016-09-26
  • 打赏
  • 举报
回复
单线程也可以,我比较想知道这样为什么会出错。。 单线程如果几个画图函数一起执行速度会变慢吧
zgl7903 2016-09-26
  • 打赏
  • 举报
回复
建议只在一个线程中绘制, 容易控制 onDraw() { if(fb) { } //填充背景 if(f1) { draw1(); } if(f2) { draw2(); } if(fn) { drawn(); } }
阿灿2007 2016-09-26
  • 打赏
  • 举报
回复
本来应该是四条曲线不断的平移,只要开了另一个画图线程,曲线就会出现8条甚至更多。
GDI+ SDK参考(翻译版本) 序言 4 目标 4 适用范围 4 适用读者 4 运行环境 4 文档组织 4 相关主题 4 GDI+的安全考虑 6 检验构造函数调用成功与否 6 分配缓冲区 6 错误校验 8 线程同步 9 相关主题 10 关于GDI+ 11 GDI+ 介绍 11 GDI+ 概览 11 GDI+ 的三个组成部分 11 基于类的接口架构 12 GDI+提供了哪些新东西? 12 新特征 12 编程模式的改变 15 线条、曲线和图形 19 矢量图概览 19 钢笔、线条和矩形 20 椭圆和弧 22 多边形 22 基数样条 23 贝塞尔样条 24 路径 25 画刷和填充图形 27 开放与闭合曲线 29 区域 30 裁剪 31 路径平直化 32 线条和曲线的抗锯齿功能 32 图象、位图和图元文件 33 位图类型 34 图元文件 37 绘制、定位和复制图片 39 裁剪和缩放图象 40 坐标系统和转换 42 坐标系统类型 42 以矩阵来表示转换 44 全局和局部转换 48 图形容器 51 使用GDI+ 56 使用入门 56 绘制线条 56 绘制字符串 58 使用钢笔绘制线条和形状 59 使用钢笔绘制线条和矩形 59 设置钢笔的宽度和对齐方式 60 绘制具有线帽的线条 61 联接线条 62 绘制自定义虚线 62 绘制用纹理填充的线条 63 使用画笔填充形状 63 用纯色填充形状 64 用阴影图案填充形状 64 用图像纹理填充形状 64 在形状中平铺图像 65 用渐变色填充形状 68 使用图像、位图和图元文件 68 加载和显示位图 68 加载和显示图元文件 69 记录图元文件 69 剪裁和缩放图像 71 旋转、反射和扭曲图像 72 缩放时使用插值模式控制图像质量 73 创建缩略图像 75 采用高速缓存位图来提高性能 76 通过避免自动缩放改善性能 76 读取图像元数据 77 使用图像编码器和解码器 83 列出已安装的编码器 83 列出已安装的解码器 84 获取解码器的类标识符 86 获取编码器的参数列表 88 将BMP图像转换为PNG图像 100 设定JPEG的压缩等级 101 对JPEG图像进行无损变换 102 创建和保存多帧图像 105 从多帧图像中复制单帧 107 Alpha 混合线条和填充 109 绘制不透明和半透明的线条 109 用不透明和半透明的画笔绘制 110 使用复合模式控制 Alpha 混合 111 使用颜色矩阵设置图像中的 Alpha 值 112 设置单个象素的alpha值 114 使用字体和文本 115 构造字体系列和字体 115 绘制文本 116 格式化文本 117 枚举已安装的字体 120 创建专用的字体集合 122 获取字体规格 126 对文本使用消除锯齿效果 130 构造并绘制曲线 131 绘制基数样条曲线 131 绘制贝塞尔样条 133 用渐变画刷填充形状 134 创建线性渐变 134 创建路径渐变 137 将 Gamma 校正应用于渐变 144 构造并绘制路径 145 使用线条、曲线和形状创建图形 145 填充开放式图形 147 使用图形容器 147 管理 Graphics 对象的状态 148 使用嵌套的 Graphics 容器 151 变换 154 使用世界变换 154 为什么变换顺序非常重要 155 使用区域 156 对区域使用点击检测 156 对区域使用剪辑 157 对图像重新着色 158 使用颜色矩阵对单色进行变换 158 转换图像颜色 160 缩放颜色 161 旋转颜色 164 剪取颜色 166 使用颜色重映射表 168 打印 169 将GDI+输出至打印机 169 显示一个打印对话框 172 通过提供打印机句柄优化打印 173 附录:GDI+ 参考 176
序言 4 目标 4 适用范围 4 适用读者 4 运行环境 4 文档组织 4 相关主题 4 GDI+的安全考虑 6 检验构造函数调用成功与否 6 分配缓冲区 6 错误校验 8 线程同步 9 相关主题 10 关于GDI+ 11 GDI+ 介绍 11 GDI+ 概览 11 GDI+ 的三个组成部分 11 基于类的接口架构 12 GDI+提供了哪些新东西? 12 新特征 12 编程模式的改变 15 线条、曲线和图形 19 矢量图概览 19 钢笔、线条和矩形 20 椭圆和弧 22 多边形 22 基数样条 23 贝塞尔样条 24 路径 25 画刷和填充图形 27 开放与闭合曲线 29 区域 30 裁剪 31 路径平直化 32 线条和曲线的抗锯齿功能 32 图象、位图和图元文件 33 位图类型 34 图元文件 37 绘制、定位和复制图片 39 裁剪和缩放图象 40 坐标系统和转换 42 坐标系统类型 42 以矩阵来表示转换 44 全局和局部转换 48 图形容器 51 使用GDI+ 56 使用入门 56 绘制线条 56 绘制字符串 58 使用钢笔绘制线条和形状 59 使用钢笔绘制线条和矩形 59 设置钢笔的宽度和对齐方式 60 绘制具有线帽的线条 61 联接线条 62 绘制自定义虚线 62 绘制用纹理填充的线条 63 使用画笔填充形状 63 用纯色填充形状 64 用阴影图案填充形状 64 用图像纹理填充形状 64 在形状中平铺图像 65 用渐变色填充形状 68 使用图像、位图和图元文件 68 加载和显示位图 68 加载和显示图元文件 69 记录图元文件 69 剪裁和缩放图像 71 旋转、反射和扭曲图像 72 缩放时使用插值模式控制图像质量 73 创建缩略图像 75 采用高速缓存位图来提高性能 76 通过避免自动缩放改善性能 76 读取图像元数据 77 使用图像编码器和解码器 83 列出已安装的编码器 83 列出已安装的解码器 84 获取解码器的类标识符 86 获取编码器的参数列表 88 将BMP图像转换为PNG图像 100 设定JPEG的压缩等级 101 对JPEG图像进行无损变换 102 创建和保存多帧图像 105 从多帧图像中复制单帧 107 Alpha 混合线条和填充 109 绘制不透明和半透明的线条 109 用不透明和半透明的画笔绘制 110 使用复合模式控制 Alpha 混合 111 使用颜色矩阵设置图像中的 Alpha 值 112 设置单个象素的alpha值 114 使用字体和文本 115 构造字体系列和字体 115 绘制文本 116 格式化文本 117 枚举已安装的字体 120 创建专用的字体集合 122 获取字体规格 126 对文本使用消除锯齿效果 130 构造并绘制曲线 131 绘制基数样条曲线 131 绘制贝塞尔样条 133 用渐变画刷填充形状 134 创建线性渐变 134 创建路径渐变 137 将 Gamma 校正应用于渐变 144 构造并绘制路径 145 使用线条、曲线和形状创建图形 145 填充开放式图形 147 使用图形容器 147 管理 Graphics 对象的状态 148 使用嵌套的 Graphics 容器 151 变换 154 使用世界变换 154 为什么变换顺序非常重要 155 使用区域 156 对区域使用点击检测 156 对区域使用剪辑 157 对图像重新着色 158 使用颜色矩阵对单色进行变换 158 转换图像颜色 160 缩放颜色 161 旋转颜色 164 剪取颜色 166 使用颜色重映射表 168 打印 169 将GDI+输出至打印机 169 显示一个打印对话框 172 通过提供打印机句柄优化打印 173 附录:GDI+ 参考 176
GDI+用法参考,各种函数的参数说明。 序言 4 目标 4 适用范围 4 适用读者 4 运行环境 4 文档组织 4 相关主题 4 GDI+的安全考虑 6 检验构造函数调用成功与否 6 分配缓冲区 6 错误校验 8 线程同步 9 相关主题 10 关于GDI+ 11 GDI+ 介绍 11 GDI+ 概览 11 GDI+ 的三个组成部分 11 基于类的接口架构 12 GDI+提供了哪些新东西? 12 新特征 12 编程模式的改变 15 线条、曲线和图形 19 矢量图概览 19 钢笔、线条和矩形 20 椭圆和弧 22 多边形 22 基数样条 23 贝塞尔样条 24 路径 25 画刷和填充图形 27 开放与闭合曲线 29 区域 30 裁剪 31 路径平直化 32 线条和曲线的抗锯齿功能 32 图象、位图和图元文件 33 位图类型 34 图元文件 37 绘制、定位和复制图片 39 裁剪和缩放图象 40 坐标系统和转换 42 坐标系统类型 42 以矩阵来表示转换 44 全局和局部转换 48 图形容器 51 使用GDI+ 56 使用入门 56 绘制线条 56 绘制字符串 58 使用钢笔绘制线条和形状 59 使用钢笔绘制线条和矩形 59 设置钢笔的宽度和对齐方式 60 绘制具有线帽的线条 61 联接线条 62 绘制自定义虚线 62 绘制用纹理填充的线条 63 使用画笔填充形状 63 用纯色填充形状 64 用阴影图案填充形状 64 用图像纹理填充形状 64 在形状中平铺图像 65 用渐变色填充形状 68 使用图像、位图和图元文件 68 加载和显示位图 68 加载和显示图元文件 69 记录图元文件 69 剪裁和缩放图像 71 旋转、反射和扭曲图像 72 缩放时使用插值模式控制图像质量 73 创建缩略图像 75 采用高速缓存位图来提高性能 76 通过避免自动缩放改善性能 76 读取图像元数据 77 使用图像编码器和解码器 83 列出已安装的编码器 83 列出已安装的解码器 84 获取解码器的类标识符 86 获取编码器的参数列表 88 将BMP图像转换为PNG图像 100 设定JPEG的压缩等级 101 对JPEG图像进行无损变换 102 创建和保存多帧图像 105 从多帧图像中复制单帧 107 Alpha 混合线条和填充 109 绘制不透明和半透明的线条 109 用不透明和半透明的画笔绘制 110 使用复合模式控制 Alpha 混合 111 使用颜色矩阵设置图像中的 Alpha 值 112 设置单个象素的alpha值 114 使用字体和文本 115 构造字体系列和字体 115 绘制文本 116 格式化文本 117 枚举已安装的字体 120 创建专用的字体集合 122 获取字体规格 126 对文本使用消除锯齿效果 130 构造并绘制曲线 131 绘制基数样条曲线 131 绘制贝塞尔样条 133 用渐变画刷填充形状 134 创建线性渐变 134 创建路径渐变 137 将 Gamma 校正应用于渐变 144 构造并绘制路径 145 使用线条、曲线和形状创建图形 145 填充开放式图形 147 使用图形容器 147 管理 Graphics 对象的状态 148 使用嵌套的 Graphics 容器 151 变换 154 使用世界变换 154 为什么变换顺序非常重要 155 使用区域 156 对区域使用点击检测 156 对区域使用剪辑 157 对图像重新着色 158 使用颜色矩阵对单色进行变换 158 转换图像颜色 160 缩放颜色 161 旋转颜色 164 剪取颜色 166 使用颜色重映射表 168 打印 169 将GDI+输出至打印机 169 显示一个打印对话框 172 通过提供打印机句柄优化打印 173 附录:GDI+ 参考 176

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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