0

テキストブロックへの出力に問題があります。基本的に私がしていることはこれです:

private void ReadData()
    {
        double dHeading = 0;
        int iHeading = 0;
        String sString = "";
        while (!stop)
        {
            //Get Heading
            result = fsuipc.FSUIPC_Read(0x0580, 4, ref token, ref dwResult);
            result = fsuipc.FSUIPC_Process(ref dwResult);
            result = fsuipc.FSUIPC_Get(ref token, ref dwResult);
            dHeading = dwResult;

            if (dHeading != 0)
            {
                dHeading = dHeading * 360 / (65536.0 * 65536.0);
                iHeading = Convert.ToInt32(dHeading);
            }
            if (iHeading < 0)
            {
                iHeading = 360 + Convert.ToInt32(dHeading);
            }
            if (iHeading == 0)
            {
                iHeading = 360;
            }
            if (result == true && iHeading < 10)
            {
                sString =  "00" + Convert.ToString(iHeading);
            }
            if (result == true && iHeading >= 10 && iHeading < 100)
            {
                sString = "0" + Convert.ToString(iHeading);
            }
            if (result == true && iHeading >= 100)
            {
                sString = Convert.ToString(iHeading);
            }

            txbHeading.Text = sString;
            // But if I change this line to MessageBox.Show(sString);
            // it works fine.
        }
    }

プログラムがフリーズし、何もできなくなります。VSで止めなければなりません。txbHeading.Text = sStringをMessageBox.Show(sString)に変更すると、正常に機能します。

私はC#から始めたばかりであることに注意してください。前もって感謝します!

4

2 に答える 2

2

コードのwhileループにより、UIスレッドがブロックされるため、メソッドが呼び出されたときにプログラムが応答を停止する必要があります。バックグラウンドワーカーを使用すると、GUIをブロックすることなく、コードを別のスレッドで実行できます。

于 2013-01-25T00:54:18.227 に答える
1

試す

this.Invoke(new Action(() => txbHeading.Text = sString))

代わりは。UIスレッドの外で実行していると仮定します。

詳細:マルチスレッドの実用ガイド-パート1

于 2013-01-25T00:53:57.800 に答える