GTK#でsystem.drawingを使用してイメージを操作しようとしています。ユーザーが更新するとすぐに画面上のイメージをUIで更新しますこれを実装するには、winformsのバックグラウンドワーカーを使ってみましたが、うまくいきました。しかし、テキストボックスが高速に更新されると、アプリケーションはエラーなく止まってしまいます。GTKからSystem.Drawing.Bitmapにアクセスする#Thread throwsオブジェクト現在他の場所で使用中例外
私はここで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
}
これは、テキストボックス内のエントリの速さは、私が間違ってやって少しでもfast.Whatイムあるときに、背景の労働者は、ここで他の場所でエラーimage=new Bitmap(backupimage);
現在使用中のオブジェクトを投げるよりも悪い動作しますか?
アップデート1:
イム古いスレッドが完了する前に、同じ操作を行い、スレッドを呼び出す同じtime.Imで2つの異なる操作を行う2つの異なるスレッドを使用して同じ画像を処理していませんバックグラウンドワーカーでは、古いスレッドが新しいスレッドを起動する前に作業を完了しているかどうかを確認する方法が必要です。基本的には、同じスレッドのインスタンスが実行されているかどうかを確認する方法です 行うことif(backgroundworker.isbusy==false) then do stuff
パフォーマンスの低下
とアップデート2
ソリューションのグローバルビットマップの交換@vooによって示唆されるようには私がやったissue.Whatを解決する助け代わりにグローバルbitmap.Iを使用してのものでグローバルを作成文字列(ファイル名)。今私はimg=new Bitmap(filename)
を使用しています。私はエラーが出なかったので、速く実行しました.GUIを更新するためにインオーダーしました。私はここに示唆したように呼び出しを使用しましたmono-project.com/docs/gui/gtksharp/responsive-applications/。タイピング操作が十分速く、待ち時間が必要です。パフォーマンスが低下しました。これはバックグラウンドワーカーの場合には当てはまりませんでした。パフォーマンスを向上させる方法はありますか?
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
をメインスレッド以外のスレッドからGUIを更新し、高価な計算が終了したメインのスレッドの通りの操作をキューにする何らかの方法があります。 – Voo
@Voo Imはスレッド内のUIを更新していません。イメージを処理するだけです。 – techno
あなたは正確な例外を使用できますか?私はlibgdiplusとmonoソースの両方をgrep-pedして、あなたが提供したテキストへの参照を見つけることができませんでした。または、Windowsで実行していますか? – fog