我正在尝试使用system.drawing在GTK#中操作图像。我希望用户更新文本框后,UI能够立即更新屏幕上的图像。为了实现这一点,我尝试使用来自winforms的background worker,它可以工作,但是当文本框以更高的速度更新时,应用程序会卡住而没有错误。
因此,我查看了GTK中的多线程,这里有一个链接:http://www.mono-project.com/docs/gui/gtksharp/responsive-applications/,并创建了一个线程。
因此,我查看了GTK中的多线程,这里有一个链接:http://www.mono-project.com/docs/gui/gtksharp/responsive-applications/,并创建了一个线程。
void textboxchanged()
{
Thread thr = new Thread (new ThreadStart (ThreadRoutine));
thr.Start ();
}
static void ThreadRoutine ()
{
LargeComputation ();
}
static void LargeComputation ()
{
image=new Bitmap(backupimage);
//Long image processing
}
当输入框中的速度稍微快一点时,后台工作线程抛出“当前对象在其他地方正在使用”错误,这比后台工作线程会产生不良影响。image=new Bitmap(backupimage);
我做错了什么?
更新1:
我没有使用两个不同的线程同时处理相同的图像进行2个不同的操作。我在旧线程完成之前调用执行相同操作的线程。由于在后台工作器中,我需要一种方法来检查旧线程是否已经完成工作,然后再启动新线程。所以,我要寻找的基本上是一种检查相同线程实例是否正在运行的方法。在winforms中,我通常会这样做:if(backgroundworker.isbusy==false) then do stuff
更新2
带有性能下降的解决方案
如@voo所建议的,替换全局位图可以解决问题。我所做的是,而不是使用全局位图,我创建了一个全局字符串(文件名)。现在我使用img=new Bitmap(filename)
。尝试以最快的速度执行,没有出现错误。因此,为了更新GUI,我使用了在这里建议的调用mono-project.com/docs/gui/gtksharp/responsive-applications/的方法。问题在于没有错误出现并且图像更新了,但是当打字操作足够快时,存在等待。性能有所下降。这在后台工作器中不是这种情况。是否有一种方法可以提高性能。
在大型图像处理操作方法的末尾,我添加了以下内容以更新GUI
Gtk.Application.Invoke (delegate {
MemoryStream istream=new MemoryStream();
img.Save (istream, System.Drawing.Imaging.ImageFormat.Png);
istream.Position = 0;
workimagepixbuff = new Gdk.Pixbuf (istream);
image1.Pixbuf = workimagepixbuff.ScaleSimple (400, 300, Gdk.InterpType.Bilinear);
});
// cannot directly convert Bitmap to Pixbuff,so doing this