0

ああ!帰ってきたぞ!私の問題で他の人に迷惑をかけるのは嫌いですが、私はこれに3日間ほど取り組んできました.

チャット アプリケーションの例を使用して、それをゲームに組み込みました。クライアントとサーバーは適切に接続しますが... クライアントに問題があります。:/

    public static void appendText(RichTextBox box, string line)
    {
        if (box == null || box.IsDisposed)
            return;
        //try
        //{
            box.AppendText(line + Environment.NewLine);
            ScrollRichTextBox(box);
        //}
        //catch
        //{
        //    Program.debug.print("Something went wrong.");
        //}
    }

AppendText 行は例外 (InvalidOperationException) をスローし続けます。try-catch をコメントアウトし、コンパイラが何が問題なのか、おそらくそれを修正する方法についてさらにアドバイスをくれることを期待しましたが、その助けを借りてもどこにも行きません。

例では、このエラーを発生させずにそのコードを実行できます。ここでどこを間違えたのかわかりません。

ああ、AppendText は次によって呼び出されます...

    public static void GotMessage(object peer)
    {
        NetIncomingMessage im;
        while ((im = s_client.ReadMessage()) != null)
        {
            // handle incoming message
            switch (im.MessageType)
            {
                case NetIncomingMessageType.DebugMessage:
                case NetIncomingMessageType.ErrorMessage:
                case NetIncomingMessageType.WarningMessage:
                case NetIncomingMessageType.VerboseDebugMessage:
                    string text = im.ReadString();
                    //TextControl.appendText(menuWindow.richTextBoxStatus, text);
                    Program.printStatus(text);
                    break;

                case NetIncomingMessageType.StatusChanged:
                    NetConnectionStatus status = (NetConnectionStatus)im.ReadByte();

                    /*if (status == NetConnectionStatus.Connected)
                        s_form.EnableInput();
                    else
                        s_form.DisableInput();
                    */

                    //if (status == NetConnectionStatus.Disconnected)
                        //s_form.button2.Text = "Connect";

                    string reason = im.ReadString();
                    Program.printStatus(status.ToString() + ": " + reason);
                    break;

                case NetIncomingMessageType.Data:
                    // incoming packet from the server, handle data
                    int size = im.ReadInt32();
                    byte[] bData = im.ReadBytes(size);

                    string data = Encoding.Unicode.GetString(bData);

                    Program.debug.print(data);
                    Program.printToChat(data);
                    handleData(data);

                    break;

                default:
                    Program.printStatus("Unhandled type: " + im.MessageType + " " + im.LengthBytes + " bytes");
                    break;
            }   
        }
    }

printToChat または printStatus が見つかる場所。これらのメソッドには、AppendText への呼び出しが含まれています。

エラーが最初に表示されたときに Lidgren Google グループに投稿しようとしましたが、彼らからの返信がありませんでした。ここにいる人々が私が探している情報を持っていることを願っています. :)

必要に応じて、より多くの情報とコードを提供できます (いつものように)。

(UI要素へのスレッドセーフな呼び出しを行う方法をGoogleで調べましたが、コードがわかりにくすぎました。最終的に解決策を実装したと思ったとき、まったく機能しませんでした..)

4

1 に答える 1

0

Pfft、私を見て、物事を理解しています。

デリゲート メソッドをフォームに正常に追加して、スレッド間でアクセスできるようにすることができました。というか信じさせられます。コードが意図したとおりに機能するようになりました。

コードを追加して、自分が何をしたかを示すことができます。そして、この種の問題で誰かが助けを必要とするなら、私はそうします。私はそれを説明できると思いますが、MSDNは驚異的に機能します。

いつものように、私は質問をし、コメントを読んで正しい方向に導く必要がありました.

数日後に答えることになる質問をするのを本当にやめなければなりません。:/

ごめんなさい。スペースを取り、時間を無駄にするのは本当に残念です。

編集:デリゲートを使用する必要性を回避する非常に賢い方法も書きました。ただし、タイマーを使用するか、時々ウィンドウフォームを再描画するループを使用する必要があります(私はタイマーを使用しました)。

于 2014-02-07T07:22:37.870 に答える