在多个线程中使用单个位图Graphics.CopyFromScreen最有效的方法?

时间:2014-05-04 11:23:19

标签: c# multithreading bitmap

所以我有一个线程会不断抓取屏幕截图并将从Graphics.CopyFromScreen返回的位图放入公共位图对象。这个想法是让多个其他线程使用这个位图,但仅用于读取目的,不写入位图。最初我只是尝试从中读取,但很快发现它锁定了整个位图,因此无法在其他地方使用。我的第二种选择是在每个需要使用公共位图的线程中创建一个新的临时位图,而只是tempBitMap = publicBitMap。这似乎是一些例外,我觉得这可能是更好的方式。我看到你可以锁定你需要在多个线程中使用的特定位/像素,然后在你完成它们之后释放它们,但这是否会阻止在锁定期间写入整个位图?或者它只是写入整个位图,除了那些锁定的位/像素。使用公共位图的方法一次只使用一个像素,所以这可能有效,前提是可以写入公共位图,同时锁定某些位/像素。

只是寻找最有效的解决方案,如果有人能就最有效的解决方案提出建议,我将非常感激,谢谢。

编辑:我正在使用BitMap.GetPixel()方法来锁定位图。

2 个答案:

答案 0 :(得分:2)

  

我的第二个选择是在每个需要使用公共位图的线程中创建一个新的临时位图,而只是tempBitMap = publicBitMap

这是正确的方法。您不能同时写入和读取位图。您可能应该同时激活两个位图。一个用于写作,一个用于读者。每次写完后都要换掉它们。请注意,在开始写入之前,读者必须使用位图完成。

如果每次切换变得更简单时创建一个新的位图用于写入,但是现在您遇到的问题是,一旦不再使用每个位图,您需要处理它们。如果不这样做,可以很快耗尽RAM,因为GC无法识别是否存在非托管内存缓冲区。

  

这似乎引发了一些例外,我觉得可能还有更好的方法。

您应该调试它们。没有什么根本原因,为什么这不起作用。

  

我看到你可以锁定需要在多个线程中使用的特定位/像素,然后在完成它们后释放它们,但这是否会阻止在锁定期间写入整个位图?

我不知道。这听起来像一个非常复杂的计划。让一些区域可读且一些可写需要相当多的协调,你永远不能读取一致的完整位图。

  

寻找最有效的解决方案

那将是两位图模型。

答案 1 :(得分:0)

我猜你只设置另一个变量来指向同一个位图。您需要Clone位图在每个线程中使用不同的位图。