2012-07-11 24 views
0

我如何在此for循環中使用後臺工作?我如何使用背景工人在此循環c#

int tmax = 10; 
int xmax = newbitmap.Width; 
int ymax = newbitmap.Height; 
for (int t = 0; t <= tmax; t += 1) 
{ 
    for (int x = 0; x < xmax; x++) 
    { 
    for (int y = 0; y < ymax; y++) 
    { 
     if ((x/xmax) > (t/tmax)) 
     { 
     Color originalco = newbitmap2.GetPixel(x, y); 
     outp.SetPixel(x, y, originalco); 
     } 
     else 
     { 
     Color originalco3 = newbitmap.GetPixel(x, y); ; 
     outp.SetPixel(x, y, originalco3); 
     } 

    } 

    pictureBox1.Image = outp; 
    } 
} 

此循環是從右向左擦拭過渡,但不顯示過渡。

+0

你想實現什麼? – 2012-07-11 08:46:27

+0

你想讓你的後臺工作人員處理該代碼?然後,把它放在工作者的'DoWork'方法中,並通過'worker.RunWorkerAsync(object)'傳遞它可能需要的任何對象... – dtsg 2012-07-11 08:46:51

回答

3

這是因爲backgroundWorker工作在不同的線程。您可以使用backgroundworker.ReportProgress(0, outp)

所以: 你需要從Vistual Studio中的事件窗口,或與該行註冊事件BackgroundWorker.ProgressChanged

backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); 

的方法:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     var outp = (Bitmap)e.UserState; 
     prictureBox.Image = outp; 
    } 

你代碼應該是:

 int tmax = 10; 
     int xmax = newbitmap.Width; 
     int ymax = newbitmap.Height; 
     for (int t = 0; t <= tmax; t += 1) 
     { 

      for (int x = 0; x < xmax; x++) 
      { 
       for (int y = 0; y < ymax; y++) 
       { 
        if ((x/xmax) > (t/tmax)) 
        { 
         Color originalco = newbitmap2.GetPixel(x, y); 
         outp.SetPixel(x, y, originalco); 
        } 
        else 
        { 
         Color originalco3 = newbitmap.GetPixel(x, y); ; 
         outp.SetPixel(x, y, originalco3); 
        } 

       } 

       backgroundWorker1.ReportProgress(t, outp); 

      } 
     } 
+0

我可以看到完整的代碼和我的代碼 – 2012-07-11 08:57:07

+0

@ OmarAl-hamawi Edited .. – 2012-07-11 09:01:07

+0

此BackgroundWorker指出它不報告進度。修改WorkerReportsProgress以聲明它報告進度。 – 2012-07-14 20:00:42

1

冷杉t,你應該使用像這裏描述的直接像素操作:http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx

然後,你應該使用一個數組作爲查找所有線程哪些線已經被繪製,哪些沒有。線程在這個數組中尋找一個新行,然後繪製它。但請記住鎖定查找數組!

1

你做的工作方法,將是這個樣子: -

private void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Bitmap newbitmap = (Bitmap)e.Argument; 

    int tmax = 10; 
    int xmax = newbitmap.Width; 
    int ymax = newbitmap.Height; 
    for (int t = 0; t <= tmax; t += 1) 
    { 

     for (int x = 0; x < xmax; x++) 
     { 
       for (int y = 0; y < ymax; y++) 
       { 
        if ((x/xmax) > (t/tmax)) 
        { 
         Color originalco = newbitmap2.GetPixel(x, y); 
         outp.SetPixel(x, y, originalco); 
        } 
        else 
        { 
         Color originalco3 = newbitmap.GetPixel(x, y); ; 
         outp.SetPixel(x, y, originalco3); 
        } 

       } 
       pictureBox1.Image = outp; 
     } 
     } 
     bgWorker.ReportProgress(0,outp); 
} 

然後當你的工人報告進度,這會引起以下事件,您可以安全地更新UI:

private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    //UPDATE YOUR UI HERE 
} 
+0

Downvoter關心評論? – dtsg 2012-07-11 09:13:31

1

您可以使用Background Worker的ReportProgress方法來更新UI。

Read more

+0

你能寫出完整的代碼嗎? – 2012-07-14 19:53:04