-3

タイマーを使用して、ログファイルを定期的に読み込み、C#で開発しているWindowsフォームアプリケーションのテキストボックスに特定のコンテンツを投稿しています。これを行うには、set_textbox_threadに文字列を送信します。この文字列は、以下のelseの適切なテキストボックス(tbc)にテキストを投稿します。以下のコードは、私が作成した練習用アプリケーションで機能します。ただし、同じコードが実行されますが、作成しているアプリケーション全体でテキストボックスを更新できません。Invokeステートメントで失敗しているようです。Invokeステートメントはset_textbox_threadを再度呼び出すことができません。私の理論では、私の完全なアプリケーションにはより複雑なコントロールのセットがあるため、正しいコントロールを介してInvokeを呼び出していません。親パネル、親フォーム、およびset_textbox_threadをトリガーするボタンを介してこれを呼び出してみましたが、同じ結果を処理しています。2つの質問:

  1. どのコントロールの下でInvokeを呼び出す必要がありますか?
  2. 「Windowsハンドルの基礎となるコントロールを所有するスレッドを取得する方法はありますか?Controls.Ownerメソッドを使用してこれを行うことはできますか?
  3. try / catchを使用してこのInvoke呼び出しを試みましたが、catchでエラーメッセージを取得できません。この方法で問題を解決する方法はありますか?

前もって感謝します!

private delegate void stringDelegate(string s);        
private void set_textbox_thread(string s)
    {
        TextBox tbc = get_thread_tb();

        if (tbc.InvokeRequired)
        {
            MessageBox.Show("Invoke Required");
            stringDelegate sd = new stringDelegate(set_textbox_thread);
            **this.Invoke(sd, new object[] {s });**
            MessageBox.Show("Invoke Completed");
        }
        else
        {
4

2 に答える 2

0

1)どのコントロールを呼び出すかは問題ではありません。UIスレッドは1つだけで、そのUIスレッドへのコールバックをマーシャリングするためのコントロールがあります。

2)このスレッドで何ができるでしょうか?

3)そこにはあまり詳細がありません。エラーメッセージがあることをどうやって知っていますか?そして、「エラーメッセージ」とはどういう意味ですか

于 2012-07-17T19:57:25.833 に答える
0

代わりに、テキスト ボックスで invoke を呼び出します。

tbc.Invoke(sd, new object[] {s });
于 2012-07-17T19:57:39.867 に答える