gpt4 book ai didi

c# - 多线程系统.Windows.图形

转载 作者:行者123 更新时间:2023-11-30 12:55:35 26 4
gpt4 key购买 nike

我当然知道我不能画在同一个Graphics上来自不同线程的对象,但我不能绘制到不同也是真的吗Graphics不同线程中的对象?

考虑以下控制台程序:

class Program
{
static ThreadDrawer[] drawers;
static void Main(string[] args)
{
int numThreads = 8;
drawers = new ThreadDrawer[numThreads];
for (int i = 0; i < numThreads; i++)
{
drawers[i] = new ThreadDrawer();
drawers[i].Start();
}
for (int i = 0; i < numThreads; i++)
{
drawers[i].Wait();
}
Console.WriteLine("Complete.");
Console.ReadKey();
}

class ThreadDrawer
{
private Thread thread;
private AutoResetEvent resetEvent;

public ThreadDrawer()
{
thread = new Thread(DrawRandomCircles);
resetEvent = new AutoResetEvent(false);
}

public void Start()
{
thread.Start();
}

public void Wait()
{
resetEvent.WaitOne();
}

public void DrawRandomCircles()
{
Random r = new Random(Environment.TickCount);
using (Bitmap b = new Bitmap(1000, 1000))
using (Graphics g = Graphics.FromImage(b))
{
for (int i = 0; i < 100000; i++)
{
g.DrawEllipse(Pens.Red, new Rectangle(r.Next(1000), r.Next(1000), 200, 200));
}
}
resetEvent.Set();
}
}
}

程序创建一个 Bitmap在每个线程中并继续使用 Graphics 在其上绘制随机椭圆对象,也是从 Bitmap 中按线程生成的.

由于需要为 .net2 构建多线程是使用 Thread 实现的s 和 AutoResetEvent s 而不是 TPL。

程序执行时不会抛出异常,但它是串行执行的。使用 n threads 将执行时间乘以 n使用任务管理器可以清楚地看到只使用了一个内核。

请务必注意,这些都与任何 UI 元素无关

这是怎么回事?是 Graphics对象锁定在静态对象上?

最佳答案

这是并发分析器的屏幕截图,我用来查看这些线程的运行情况:

enter image description here

是的,您可以看到很多红色(阻塞)和绿色 Blob (执行)。线程轮流进入内部 GpGraphics::RenderDrawPath() 函数获取的关键部分。较大的绿色 Blob 是程序实际绘制线条的位置(我用 DrawRectangle 替换了 DrawEllipse 并去掉了 Random 调用)。

存在一些并发性,例如,您可以看到 RenderDrawPath() 调用被渲染抗锯齿线的代码重叠,总体 cpu 负载约为 35%。但数量不多。

当然,您对此无能为力。您可以通过在您自己的程序中重叠逻辑来决定使用 GDI+ 调用绘制什么。这通常会发生,测试过于综合。

关于c# - 多线程系统.Windows.图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47499004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com