2012-09-11 60 views
2

我正嘗試在使用Backgroundworker的MONO上構建應用程序。當我使用順序方法時,我的應用程序工作正常。基本上,我的應用程序通過點擊按鈕在繪圖區域繪製一些矩形。Gtk.Application.Invoke無法正常工作

我想比較順序,使用Backgroundworker和其他人之間的執行時間的差異。

我在使用後臺工作的問題,看看下面的代碼,

static void DoWork (object sender, DoWorkEventArgs e) 
    { 
     Context ct = (Context)e.Argument; 
     house.DrawHouse rect = new house.DrawHouse(); 
     PointD p1, p2, p3, p4; 

     p1 = new PointD (55, 250); 
     p2 = new PointD (65, 250); 
     p3 = new PointD (65, 90); 
     p4 = new PointD (55, 90); 
      Gtk.Application.Invoke (delegate { 
       ct.MoveTo (p1); 
       ct.LineTo (p2); 
       ct.LineTo (p3); 
       ct.LineTo (p4); 
       ct.LineTo (p1); 
       ct.ClosePath(); 
       ct.Color = new Color (0, 0, 0); 
       ct.FillPreserve(); 
       ct.Color = new Color (255, 255, 255); 
       ct.Stroke(); 
      }); 
     } 
    } 
在上面的代碼工作線程

是創建創建矩形,並給人以GUI線程進行打印。但它會在ct.MoveTo(p1)中拋出一個錯誤;

Following is the error

希望從某一個很快聽到。

回答

1

您確定您在GUI線程中調用該代碼嗎?爲了找出答案,你可以使用this tool

另外,讓我猜測:你在Windows上運行這個,不是嗎?我得到了這樣的印象,因爲AccessViolationExceptions在MS.NET上比在Mono上更頻繁(某種程度上,與非託管世界的互操作性在Mono上不那麼嚴格)。

這個問題有時候會引入bug,但還沒有解決。在MS.NET中,這些問題通常通過應用適當的調用約定來解決。一個例子是this,也許你錯過了一些? (或開羅的綁定?一定要克隆gtk-sharp並看看被調用的DllImport;也許你可以發現一個錯誤併發送一個拉請求來修復它?)

0

你是對的。是的,我在Windows上運行它。對於你的第一點,工作線程將啓動任務並創建矩形並給出GUI線程以將其打印在屏幕上。 (Gtk.Application.Invoke(代表{});這將切換到GUI線程)

看一看下面的代碼,我做同樣的事情,但不是在畫的透視,但它確實有些費時計算。耗時的計算由工作者線程完成,並將結果提供給GUI線程以在UI上打印。這對我來說絕對沒問題。

void DoWork (object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 
    var watch = Stopwatch.StartNew(); 

    for (int i = lowerLimit; i <= upperLimit; i++) { 
     int j = i; 
     var result = SumRootN (j); 
     Gtk.Application.Invoke (delegate { 
      textview15.Buffer.Text += "root " + j.ToString() + " = " + result.ToString() + Environment.NewLine; 
     }); 
     worker.ReportProgress ((int)(((double)i/(double)upperLimit) * 100)); 
    } 
    var time = watch.ElapsedMilliseconds; 
    textview20.Buffer.Text = "Background Worker: \n execution took " + time + " MS to \n complete the execution \n SLOW & RESPONSIVE"; 
} 

但是,如果我在繪畫上做同樣的事情,它給了我上面附加的錯誤。

請指正

感謝您的答覆knocte如果我錯了,我會看你的反應。