2016-08-24 55 views
0

图像运行里面的一些数据处理的Thread一个适当的方式我有一个类:读取来自其他线程

void thread_function() 
{ 
    while (client != null) 
    { 
    ....some stuff... 
    wrBitmap.WritePixels(rect, rgbch, rowLen, 0); // wrBitmap is WriteableBitmap 
    OnFrameRdy(this, MyEventsArgs); 
    } 
} 

我怎样才能从没有记忆复制此Thread进程读取wrBitmap?我需要将wrBitmap绑定到我的Image wpf控件。那可能吗?

或者做到这一点的唯一方法 - 是将wrBitmap复制到类中的其他变量并在我的控件中读取它? 我不想复制变量,导致它给我一个巨大的内存开销。

我想我可以使用事件并创建我的OnFrameRdy事件,但仍然不让我使用数据。 这将是非常酷的,如果我可以只输入Image.source = MyClass.wrBitmap

+0

你是什么意思“不让我使用数据”?你在这里遇到什么问题?为什么你不能在线程中执行'Image.source = MyClass.wrBitmap'? – slawekwin

+0

您是否打算在将它分配给图像控件后修改WritePixels。 – Clemens

+0

当我试图编写'Image.source = MyClass.wrBitmap'时,出现'InvalidOperationException'异常。这是因为wrBitmap是在其他'Thread'中创建的。我不知道如何将wrBitmap数据传输到我的Image控件,而无需内存开销。 – Aleksey

回答

0

猜测你是从尝试从不同的线程设置Source属性越来越InvalidOperationException或在不同的线程比创建使用Bitmap(你严重应更明确地说明你想要解决什么问题)。

如果我是对的,你应该Freeze你的位图(这不允许改变它)并在UI线程上调用Image.Source。这应该适合你:

void thread_function() 
{ 
    while (client != null) 
    { 
     ....some stuff... 
     wrBitmap.WritePixels(rect, rgbch, rowLen, 0); // wrBitmap is WriteableBitmap 
     wrBitmap.Freeze(); 
     Dispatcher.BeginInvoke((Action)(() => Image.Source = wrBitmap)); 
    } 
} 
+0

是的,你说得对,'InvalidOperationException'是我的问题,因为我试图连接来自不同线程的'Source'属性和'Bitmap'。 'Freeze'和'Dispatcher'工作正常,但我想在循环中使用'wrBitmap','Freeze'不要让我这样做。有没有什么方法可以在循环中使用相同的'wrBitmap',并且只有在完成时才将它提供为'source'? – Aleksey

+0

恐怕我不明白你的意思是“在周期中使用wrBitmap'”。请详细说明,最好是作为对问题的编辑。如果你想增量构建图像,并在每次迭代后显示结果,我不相信没有复制中间图像就可以完成。 – slawekwin