2009-05-01 17 views
2

スレッドに未解決の問題があります。それは初めてのことです。私は、テキストボックスに書き込むために1つのスレッドを使用する方法を知っていますが、私は仕事をするためにそれらの2つを使用する方法がありません。誰でも私は同じテキストボックスに書き込むために2つのスレッドを使用できるようにするために何をしなければならないのかを知っているが、同じ時間ではない。ありがとうございました。2つのスレッドを使用してテキストボックスに書き込む

+1

どの言語? – Aziz

+0

私はそれを行うためにC#を使用して – Allek

答えて

3

ここでは、複数のテキストボックスに乱数を書き込むために2つのスレッドを使用する例を示します。 BrandonとJon Bが指摘するように、Invoke()を使用してGUIスレッドへの呼び出しをシリアル化する必要があります。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    Random m_random = new Random((int)DateTime.Now.Ticks); 
    ManualResetEvent m_stopThreadsEvent = new ManualResetEvent(false); 

    private void buttonStart_Click(object sender, EventArgs e) 
    { 
     Thread t1 = new Thread(new ThreadStart(ThreadOne)); 
     Thread t2 = new Thread(new ThreadStart(ThreadTwo)); 

     t1.Start(); 
     t2.Start(); 
    } 

    private void ThreadOne() 
    { 
     for(;;) 
     { 
      int n = m_random.Next(1000); 
      AppendText(String.Format("One: {0}\r\n", n)); 
      if(m_stopThreadsEvent.WaitOne(n)) 
      { 
       break; 
      } 
     } 
    } 

    private void ThreadTwo() 
    { 
     for(;;) 
     { 
      int n = m_random.Next(1000); 
      AppendText(String.Format("Two: {0}\r\n", n)); 
      if(m_stopThreadsEvent.WaitOne(n)) 
      { 
       break; 
      } 
     } 
    } 

    delegate void AppendTextDelegate(string text); 

    private void AppendText(string text) 
    { 
     if(textBoxLog.InvokeRequired) 
     { 
      textBoxLog.Invoke(new AppendTextDelegate(this.AppendText), new object[] { text }); 
     } 
     else 
     { 
      textBoxLog.Text = textBoxLog.Text += text; 
     } 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     m_stopThreadsEvent.Set(); 
    } 
} 
+0

それは私に役立った、ありがとう:) –

0

最も安全な方法は、1つのスレッドのみがテキストボックス(または任意のGUIオブジェクト)で作業できることです。テキストボックスでアクションを実行する必要がある他のスレッドには、テキストボックス。

あなたの質問はスレッド間の通信方法になります。これは言語/ OS固有のものになるため、より多くの情報を提供する必要があります。

+0

あなたが求めているかどうかは分かりません。私はこのようなsthを行う必要があります:例えば、私はスレッドを開始した後、テキストボックスのテキストの長さを確認し、テキストボックスが無料であるかどうかを確認するために5秒後にそれを書いて、2スレッドと1テキストボックスを書く1つのスレッドがtextBoxを使用している間、他のものが最初のものとして実行し、textBoxがフリーであるかどうかを確認してください。そうでなければ、ランダムな時間スリープしてから再度チェックしてください。 – Allek

0

このMSDN Articleは、Windowsフォームコントロールにスレッドセーフな呼び出しを行う方法を説明しています。

0

GUIコンポーネントは、メインスレッドからのみアクセスできます。別のスレッドからテキストボックスに書き込むには、BeginInvoke()を使用する必要があります。

1

もう1つのオプションは、スレッドコールバックメソッドを使用することです。これはメインスレッド上に存在するメソッドですが、新しいスレッドを作成するときは、このメソッドへのハンドル/参照を渡します。これにより、2番目のスレッドがメインスレッドのメソッドを呼び出すことができ、テキストボックスを更新/チェックする機能がそこにあります。

スレッド間で代理人を渡して調べます。

1

オプションは、キューオブジェクトにメッセージをプッシュし、このキューからメッセージを読み込んでテキストボックスに書き込むためにWindowsフォーム上のタイマーを使用します。

niceとthreadsagesをすべて作成するには、Queueオブジェクトを読み書きするときにロックすることができます。例えば

private Queue<string> messages = new Queue<string>(); 

    /// <summary> 
    /// Add Message To The Queue 
    /// </summary> 
    /// <param name="text"></param> 
    public void NewMessage(string text) 
    { 
     lock (messages) 
     { 
      messages.Enqueue(text); 
     } 
    } 

    private void tmr_Tick(object sender, EventArgs e) 
    { 
     if (messages.Count == 0) return; 
     lock (messages) 
     { 
      this.textBox.Text += Environment.NewLine + messages; 
     } 
    } 
関連する問題