VC中怎么用多线程画图,不显示画图过程啊,我是新手

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC中怎么用多线程画图,不显示画图过程啊,我是新手相关的知识,希望对你有一定的参考价值。

如果用DC的话,也就是设备内容(CreateCompatibleDC),多线程绘制意义不大。因为DC的缘故,线程必须要做同步,所以最终的效率不会有多大提升,也就是多一个系统调度时间片而已。

因此,
1、如果在CreateCompatibleDC的情况下必须使用多线程的话,那就是要用系统临界区对全局DC(绘图设备内容)做原子访问限制。具体可以搜索一下“系统临界区”。
2、如果不一定用何种绘图手段,需要多线程来大幅度提升效率的话,我推荐采用定义全局画布缓冲区,然后对每一个绘图线程分配其各自的Rect,用以绘制,最后用DirectDraw或Direct3D将缓冲区复制到显卡即可。这样效率是最高的。
例如:
unsigned char g_ucGraphMemory[1024*768*4]; //全局画布缓冲区,1024x768大小,32位色(A8R8G8B8)

typedef struct

unsigned char *ptrOffset;
unsigned long dwLength;
DrawRect; // 每个线程需要画的区域

int main()

/* 将整个画布(g_ucGraphMemory)分割成4块区域 */
DrawRect mRect[4];
mRect[0].ptrOffset = g_ucGraphMemory;
mRect[1].ptrOffset = g_ucGraphMemory + (1024 * 768);
mRect[2].ptrOffset = g_ucGraphMemory + ((1024 * 768) * 2);
mRect[3].ptrOffset = g_ucGraphMemory + ((1024 * 768) * 3);
mRect[0].dwLength = 1024 * 768;
mRect[1].dwLength = 1024 * 768;
mRect[2].dwLength = 1024 * 768;
mRect[3].dwLength = 1024 * 768;
/***********************************************/

CreateThread(..., Thread1, &mRect[0]); // 创建绘图线程1
CreateThread(..., Thread2, &mRect[1]); // 创建绘图线程2
CreateThread(..., Thread3, &mRect[2]); // 创建绘图线程3
CreateThread(..., Thread4, &mRect[3]); // 创建绘图线程4
......
WaitForSingleObject(); // 等待线程绘图完毕
Direct3DCreate9(); // 创建D3D设备
....
CreateTexture(); // 创建纹理
....
CreateVertexBuffer(); // 创建顶点缓冲区
....
LockRect(); // 锁定纹理区域
memcpy(); // 把g_ucGraphMemory复制到D3D纹理缓冲区内
....
DrawPrimitive(); // 把纹理贴到多边形上
....
Present(); // 显卡绘图
....


// 绘图线程1
DWORD WINAPI Thread1(DrawRect *ptrRect)

ptrRect->ptrOffset; // 这个便是此线程需要绘制的区域始地址
ptrRect->dwLength ; // 这个是此线程需要绘制的区域大小
..... // 这里可以使用像素填充法、向量、GDI复制到内存区等手段进行绘制
..... // 通知主线程绘图完毕


// 绘图线程2
DWORD WINAPI Thread2(DrawRect *ptrRect)

....


// 绘图线程3
DWORD WINAPI Thread3(DrawRect *ptrRect)

....


// 绘图线程4
DWORD WINAPI Thread4(DrawRect *ptrRect)

....


以上只是一个多线程分块内存缓冲区绘图的流程例子,实际代码要多一些。此处主要表达分块的思想和主线程等待分线程绘图并进行显示的流程。
其中分块过程是为了简单,所以采用数组直接分段。实际中需要按照应用场合进行调整,如按行像素分块、按列像素分块、按矩形像素分块等。
参考技术A CreateCompatibleBitmap
CreateCompatibleDC
然后就在这个dc上面画
参考技术B CreateCompatibleBitmap
CreateCompatibleDC
然后就在这个dc上面画

JAVA怎么定时自动画图

我要用JAVA画一个折线图,每秒会从数据库中读取一个数字,然后自动在画布上刷新,程序该怎么写,,,我画图会画,加一个定时器不知道该怎么加,在定时器中画图不显示,最好能有代码,谢谢

参考技术A 用线程, 画布那里提供一个画的方法,然后 写个线程 里面是while(true) 的 在这里面读取然后调用画布提供的方法,然后让线程sleep一下追问

还是看不太明白,能贴上代码么,谢谢

参考技术B 使用SwingWorker + ScheduledExecutorService 参考技术C 会画图就容易多了,给你个思路,多线程。 将画图部分创建一个独立的线程来处理。
还不清楚在说,我弄个demo给你看看。追问

还是看不太明白,能贴上代码么,谢谢

追答package swing;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestThreadGrp 

/**
 * @param args
 */
public static void main(String[] args) 
// TODO Auto-generated method stub
JFrame jf = new JFrame("测试标题");
jf.setSize(300,400);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JLabel jl = new JLabel();  //定义个可以在上面绘图的控件

jf.add(jl,BorderLayout.CENTER); //加入窗体中心位置

Thread th = new Thread() //定义一个线程

@Override
public void run()   //覆盖线程的运行方法
// TODO Auto-generated method stub
for(int i=0;i<100;i++) //循环100次
jl.getGraphics().clearRect(0, 0, 300, 400); //先清除上一次绘制的图案
jl.getGraphics().drawString(i+"", 100, 100); //将文字绘制到绘图控件
try 
Thread.sleep(1000); //延时1秒
 catch (InterruptedException e) 
// TODO Auto-generated catch block
e.printStackTrace();






;

jf.setVisible(true);  //显示窗体
th.start();  //线程启动




很简单的一个demo,能看明白么?

本回答被提问者采纳

以上是关于VC中怎么用多线程画图,不显示画图过程啊,我是新手的主要内容,如果未能解决你的问题,请参考以下文章

JAVA怎么定时自动画图

如何在Java中实现画图功能并在文本中显示坐标

用MATLAB怎么画图啊

matlab画图,能够在图中时时显示鼠标在图中的位置(不需要点击!!!!),请问高手们怎么实现啊

arcmap 画图过程中 坐标系中的纬度与下面显示的数字不同是怎么回事

matlab画图时怎么给多个点(有坐标)标注数字序号啊?