最有效的方法是使用单个位图图形.在多个线程中使用CopyFromScreen
本文关键字:CopyFromScreen 线程 图形 单个 有效 方法 位图 | 更新日期: 2023-09-27 18:01:39
所以我有一个线程,将不断抓取屏幕截图,并将从Graphics.CopyFromScreen
返回的位图放入公共位图对象。这个想法是让多个其他线程使用这个位图,但只用于读取目的,不写入位图。最初我只是简单地从它读取,但很快发现它锁定了整个位图,所以它不能在其他地方使用。我的第二个选择是在每个需要使用公共位图的线程中创建一个新的临时位图,并简单地使用tempBitMap = publicBitMap
。这似乎抛出了一些例外,我觉得可能有一个更好的方法。我看到您可以锁定需要在多个线程中使用的特定位/像素,然后在完成后释放它们,但是这会阻止在锁定期间对整个位图进行写入吗?或者它只是写入整个位图,除了那些锁定的位/像素。使用公共位图的方法一次只使用一个像素,所以这可能是可行的,前提是公共位图可以在一些位/像素被锁定的情况下被写入。
只是在寻找最有效的解决方案,如果有人能给我最有效的解决方案的建议,我将非常感激,谢谢。
编辑:我使用bitmap. getpixel()方法来锁定位图。
我的第二个选择是在每个需要使用公共位图的线程中创建一个新的临时位图,并且简单地tempBitMap = publicBitMap
这是正确的方法。您不能同时写入和读取位图。你可能应该有两个位图同时活动。一个给写作,一个给读者。每次写完之后,你都要交换它们。注意,在开始写操作之前,读操作必须先处理好位图。
如果你每次都为写创建一个新的位图,那么切换就会变得更简单,但是你现在遇到的问题是,一旦每个位图不再使用,你就需要处理它。如果你不这样做,你可能很快就会耗尽内存,因为GC无法识别非托管内存缓冲区的存在。
这似乎引发了一些异常,我觉得可能有一个更好的方法。
你应该调试它们。没有什么根本原因说明这行不通。
我看到你可以锁定你需要在多线程中使用的特定位/像素,然后在完成后释放它们,但是这会阻止在锁定期间对整个位图进行写入吗?
我不知道。这听起来像是一个非常复杂的计划。拥有一些可读的区域和一些可写的区域将需要相当多的协调,并且您永远无法读取一致的完整位图。
寻找最有效的解决方案
这就是双位图模型
我猜你只设置了另一个变量指向相同的位图。您需要克隆位图,以便在每个线程中使用不同的位图。