0


私は何日も私を悩ませてきた問題を抱えています..私はこのウェブサイトや他の多くのウェブサイトから非常に多くのチュートリアルとコードスニペットを試しました。P2Pアプリケーションを構築していますが、メインスレッドへのアクセスに問題があります。
アプリケーションの簡単なフローは次のとおり
です。1。frmMainが表示されます-ユーザーがログインボタンをクリックします
2.frmloginが表示されます-ユーザーが名前を入力します
3.「ログイン」後に-2つのスレッドが作成されます(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.スレッドは「サーバー」と呼ばれる1つの別個のクラスで機能します。そこで彼らは着信接続を待ち、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);
}

次のようなfrmDataGridVerifyUIRequestからメソッドを呼び出しています。

 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;
 }

いくつかのラムダ式を使用して、begin invokeでこれを実行しようとしましたが、何も成功しませんでした。誰かが私にエラーを指摘したり、他の方法で助けたりできますか?とても感謝しております。PSこれは私の最初の投稿ですので、フォーマットが不十分な場合は、事前にお詫び申し上げます。:)

編集:問題は明らかにインスタンスにあるので、私は次のようなことをしました:frmDataGridクラスのインスタンスを作成するサーバークラスから、3つの引数を取るコンストラクターを呼び出します。frmDataGrid fdg = new frmDataGrid(fileName、100、100); そのコンストラクターで、frmDataGridで、verifyUIRequestを呼び出します。しかし、その後、別のエラーが発生し、私はそれを理解できないようです。で止まります

if (dgvDown.InvokeRequired)
{...

エラーは次のとおりです:「オブジェクト参照がオブジェクトのインスタンスに設定されていません」、つまりNullReferenceException。エラーは何でしょうか?

4

1 に答える 1

0

メソッドでまったく新しいデータグリッドを作成していますdownloadFile。メイングリッドを更新し、スレッドメソッドからそのメソッドを呼び出す必要がありdownloadFileます。メソッドが終了するときにフロアにドロップする新しいグリッドを作成するのではありません。

于 2012-07-09T14:22:08.903 に答える