Pregunta

Tengo un problema sin resolver con los hilos. Es la primera vez que lo hago. Sé cómo usar un hilo para escribir en una caja de texto, pero no tengo idea de cómo usar dos de ellos para hacer el trabajo. Cualquiera que tenga una pista, ¿qué debo hacer para poder usar dos hilos para escribir en el mismo cuadro de texto, pero no al mismo tiempo? Gracias.

¿Fue útil?

Solución

Este es un ejemplo que utiliza dos hilos para escribir números aleatorios en un cuadro de texto de varias líneas. Como señalaron Brandon y Jon B, debe usar Invoke () para serializar las llamadas al hilo de la 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();
    }
}

Otros consejos

Otra opción es usar un método de devolución de llamada de hilo. Este es un método que existe en el subproceso principal, pero al crear un nuevo subproceso, pasa un identificador / referencia a este método. Esto permite que el segundo subproceso llame al método en el subproceso principal y la funcionalidad para actualizar / verificar el cuadro de texto se ubicaría allí.

Mira a los delegados que pasan entre los hilos.

Una de las opciones que puede hacer es insertar mensajes en un objeto de Cola y usar un temporizador en el formulario de Windows para leer los mensajes de esta cola y escribir en el cuadro de texto.

Con el fin de hacer que todo sea agradable y en subprocesos, puedes bloquear el objeto Queue al leer y escribir en él.

Por ejemplo:

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

el enfoque más seguro es tener solo 1 hilo para poder trabajar en el cuadro de texto (o cualquier objeto de la interfaz gráfica de usuario), tener cualquier otro hilo que necesite realizar una acción en el cuadro de texto para comunicar sus necesidades al hilo que controla el texto. caja.

de modo que su pregunta se convierta en cómo comunicarse entre los subprocesos, esto será específico del idioma / sistema operativo, por lo que deberá proporcionar más información.

Este Artículo de MSDN explica cómo realizar llamadas seguras por hilos a controles de formulario de windows.

Solo puedes acceder a los componentes GUI desde el hilo principal. Para escribir en un cuadro de texto desde otro hilo, debe usar BeginInvoke () .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top