سؤال

ولدي بعض المشكلات التي لم تحل مع المواضيع. إنها المرة الأولى التي تقوم بذلك. أنا أعرف كيفية استخدام مؤشر واحد لكتابة في مربع نص، ولكن ليس لدي أي فكرة عن كيفية استخدام اثنين منهم للقيام بهذه المهمة. أي شخص لديه أدنى فكرة عما يمكنني القيام به لتكون قادرة على استخدام اثنين من المواضيع لكتابة لنفس النص، ولكن ليس في نفس الوقت. شكرا لك.

هل كانت مفيدة؟

المحلول

وهنا مثال يستخدم خيطين لكتابة أرقام عشوائية إلى مربع نص متعدد الخطوط. كما لوحظ براندون وجون B، تحتاج إلى استخدام استدعاء () لتسلسل المكالمات إلى موضوع 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();
    }
}

نصائح أخرى

وثمة خيار آخر هو استخدام أسلوب الاستدعاء الموضوع. هذا هو أسلوب موجود على موضوع الرئيسي، ولكن عند إنشاء موضوع جديد قمت بتمرير مؤشر / إشارة إلى هذا الأسلوب. وهذا يسمح للموضوع الثاني لاستدعاء الأسلوب على موضوع الرئيسي وظائف لتحديث / مراجعة النص أجلس هناك.

والنظر في تمرير المندوبين بين المواضيع.

وخيار واحد يمكن أن تفعله، هو دفع الرسائل على كائن قائمة الانتظار و استخدام جهاز توقيت على شكل النوافذ لقراءة الرسائل من قائمة الانتظار هذه والكتابة إلى النص.

في أجل جعل كل شيء جميل وthreadsage هل يمكن قفل الكائن قائمة الانتظار عند قراءة والكتابة إليها.

وعلى سبيل المثال:

    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 موضوع تكون قادرة على العمل في مربع النص (أو أي كائن واجهة المستخدم الرسومية)، لديك أي المواضيع الأخرى التي تحتاج إلى تنفيذ إجراء على مربع النص التواصل احتياجاتهم للموضوع الذي يتحكم في النص صندوق.

وهكذا يصبح سؤالك كيفية التواصل بين المواضيع، وهذا سيكون اللغة / OS محددة لذلك تحتاج إلى توفير مزيد من المعلومات.

MSDN المادة يوضح كيفية إجراء مكالمات موضوع آمنة لل نوافذ شكل الضوابط.

ويمكنك فقط الوصول إلى عناصر واجهة المستخدم الرسومية من الخيط الرئيسي. الكتابة إلى النص من موضوع آخر، تحتاج إلى استخدام <لأ href = "http://msdn.microsoft.com/en-us/library/system.windows.forms.control.begininvoke(VS.80).aspx "يختلط =" نوفولو noreferrer "> BeginInvoke () .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top