문제

나는 몇 가지의 미해결 문제가 스레드입니다.그것은 처음 그것을 하고 있다.내가 사용하는 방법을 알고 하나의 스레드에서 쓰기 텍스트,하지만 나는 아이디어가 있지 않을 사용하는 방법은 두 그들의 작업을 수행합니다.사람이 단서 나는 무엇을 할 수 있을 사용하여 두 개의 스레드를 쓰는 동일한 텍스트 상자에서 동일한 시간입니다.감사합니다.

도움이 되었습니까?

해결책

다음은 두 개의 스레드를 사용하여 무작위 숫자를 멀티 라인 텍스트 상자에 쓰는 예입니다. 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();
    }
}

다른 팁

다른 옵션은 스레드 콜백 메소드를 사용하는 것입니다. 이것은 기본 스레드에 존재하는 메소드이지만 새 스레드를 만들 때이 메소드에 대한 핸들/참조를 전달합니다. 이를 통해 두 번째 스레드는 기본 스레드의 메소드를 호출하고 기능이있는 기능을 업데이트/확인하여 텍스트 상자가 앉아 있는지 확인할 수 있습니다.

스레드 사이에 대의원을 전달하십시오.

당신이 할 수있는 한 가지 옵션은 메시지를 큐 객체에 푸시하고 Windows 양식의 타이머를 사용 하여이 대기열에서 메시지를 읽고 텍스트 상자에 씁니다.

모든 것을 멋지고 나사산으로 만들기 위해 읽고 쓸 때 큐 개체를 잠글 수 있습니다.

예를 들어:

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

안전한 접근 방식만 있는 1 개 스레드에서 작동 할 수 있는 텍스트 상자(또는 gui 와 객체)에는,어떤 다른 스레드가 필요한 작업을 수행할 텍스트 상자에 통신의 필요를 스레드를 제어하는 텍스트 상자입니다.

그래서 당신의 질문은 간에 통신하는 방법드리는 것은 이어/OS 특정 그래서 당신은 필요한 정보를 제공합니다.

이것 MSDN 기사 Windows 양식 컨트롤에 스레드를 안전하게 호출하는 방법을 설명합니다.

기본 스레드에서 GUI 구성 요소에만 액세스 할 수 있습니다. 다른 스레드에서 텍스트 상자에 쓰려면 사용해야합니다. begininVoke ().

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top