2012-07-09 31 views
0


我有一個問題,一直在推動我堅持幾天..我已經嘗試了很多教程和代碼片段從這個和許多其他網站。我正在構建一個P2P應用程序,並且在訪問主線程時遇到問題。
這裏是我的應用程序的簡單流程:顯示
1 frmMain - 用戶點擊登錄按鈕
2. frmlogin顯示 - 「伐木」後,用戶輸入他的名字
3 - 創建兩個線程(threadTCPlistener和threadUDPlistener)
4. frmDataGrid示
從另一個線程(在另一個類中)向數據網格添加數據

Server listen = new Server(); 
Thread listeningUDPThread = new Thread(new ThreadStart(listen.startUDPServer)); 
listeningUDPThread.IsBackground = true; 
listeningUDPThread.Start(); 
Thread listeningTCPThread = new Thread(new ThreadStart(listen.startTCPServer)); 
listeningTCPThread.IsBackground = true; 
listeningTCPThread.Start(); 
frmDataGrid dg = new frmDataGrid(); 
dg.Show(); 

5.Threads中稱爲 「服務器」 一個單獨的類工作。在那裏他們等待傳入連接,並且當TCP線程接受連接時,它開始接收文件。在收到文件後,我想要更改frmDataGrid中的GUI以向網格視圖添加新行。我做了這樣的事情:

public void downloadFile() 
{ 
    //--receiving of the file-- 
    frmDataGrid fdg = new frmDataGrid(); 
    //filename is the name of received file, and 100's are just for testing (for now).  
    fdg.verifyUIRequest(fileName, 100, 100); 
} 

我打電話從frmDataGrid VerifyUIRequest的方法,看起來像這樣:

public void verifyUIRequest(string filename, int done, int percent) 
    { 
    if (dgvDown.InvokeRequired) 
     { 
     dgvDown.Invoke((MethodInvoker)delegate { updateDownDgv(filename, done, percent); }); 
     } 
    else 
    { 
     updateDownDgv(filename, done, percent); 
    } 

在此之後,主線程應該叫「updateDownDgv」的方法,但問題在於我的數據網格沒有任何問題。下面是更新的代碼:

public void updateDownDgv(string filename, int done, int percent) 
{ 
foreach (DataGridViewRow r in dgvDown.Rows) 
{ 
     if ((string)r.Cells[0].Value == filename) 
       { 
        r.Cells[1].Value = done; 
        r.Cells[2].Value = percent; 
       } 
       dgvDown.Invalidate(); 
       return; 
} 
DataTable tab = (DataTable)dgvDown.DataSource; 
DataRow row = tab.NewRow(); 
row[0] = filename; 
row[1] = percent; 
row[2] = done; 
//MessageBox.Show(done.ToString()); 
tab.Rows.Add(row); 
dgvDown.DataSource = null; 
dgvDown.DataSource = tab; 
} 

我試圖這樣做withh開始調用,具有一定的lambda表達式,但沒有succeded。任何人都可以請我指出一個錯誤或以其他方式幫助?我真的很感激。 PS這是我的第一篇文章,所以如果格式不好,我提前致歉。 :)

編輯: 因此,問題顯然是有實例,所以我做了這樣的事情:從服務器類 在那裏我創造我frmDataGrid類的實例,我現在把它的構造函數接受3個參數。 frmDataGrid fdg = new frmDataGrid(fileName,100,100);在該構造函數中,在frmDataGrid中,我調用了verifyUIRequest。但是接着發生了另一個錯誤,我似乎無法弄清楚。它停在

if (dgvDown.InvokeRequired) 
{... 

誤差是作爲folows: 「對象引用不設置爲一個對象的一個​​實例」,即NullReferenceException異常。什麼可能是錯誤?

+1

我認爲它可以幫助你分開你的問題。嘗試更新網格而不使用線程,看看它是否工作。之後,嘗試使用線程,但沒有GUI,看看是否有效。從一開始就將它們結合起來很難解決。 – 2012-07-09 14:21:04

+0

嗨Amiram,線程工作正常,他們能夠顯示我mbox時,他們甚至完成我把'verifyUIRequest'方法。此外,數據網格可以直接更新(即使用主線程)。 'downloadFile'中的 – epson121 2012-07-09 14:33:48

回答

0

您正在downloadFile方法中創建一個全新的數據網格。您應該更新主網格並根據線程方法調用該網格的方法,而不是在downloadFile方法退出時創建一個新的網格。

+0

我剛剛創建了一個在她的數據網格中有舊數據網格的實例,而不是新的數據網格。有了這個實例,我正在調用一個方法來更新名爲'dgvDown'(在'updateDgvDown'中)的舊數據網格。除了這個我正在使用的版本之外,我不知道應該以其他方式更新我的主數據網格。 – epson121 2012-07-09 14:31:56

+0

你確定嗎?如果您爲此表單調用「新」兩次,那麼您有兩個數據網格。 – 2012-07-09 14:41:47

+0

這可能是,我不確定,但無論如何,我應該至少將行添加到這個新的網格,並能夠以我的形式看到它。還是應該? – epson121 2012-07-09 14:48:36

相關問題