Показать сообщение отдельно
Старый 09.02.2014, 22:14   #18
Dark Dragon
Оператор ЭВМ
 
Аватар для Dark Dragon
 
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Многопоточность.

Подскажи как ссылку делать на метод/класс и т.д. На тех ресурсах что вы мне давали не раскрывается вопрос решения моей проблемы. Вот как выглядит моя программа в общих чертах:
namespace D
{
    public partial class Mainwindow : Form
    {
//---------------------------------------------------------------------------------------
//Глобальные переменные
        public string s;
// --------------------------------------------------------------------------------------
//=====================================================================================
        public Mainwindow()
        {
            InitializeComponent();
            Visible = false;
            Dialogbox.ReadOnly = true;
            выходToolStripMenuItem.Enabled = false;
            выходToolStripMenuItem.Visible = false;
            Point tempPoint = new Point(100, 100);
            this.DesktopLocation = tempPoint;// почему-то не работает

        }
//======================================================================================     
        private void button1_Click(object sender, EventArgs e)
        {
            s = message.Text;
            if (s != "")
            {
                Random random = new Random();
                var additionalText = s + "\n";
                var start = Dialogbox.Text.Length;
                var length = additionalText.Length;
                Dialogbox.AppendText(additionalText);
                Dialogbox.Select(start, length);
                Dialogbox.SelectionAlignment = HorizontalAlignment.Left;
                message.Text = "";

                Thread thd = new Thread(Th);
                thd.Start(); 
              
            }
        }
// ====================================================
        public void Th()
        {
            if (s != "112")
                {
                    // Обработка полученной переменной, составление выводимых данных в нее же.
                    var additionalText = s + "\n";
                    if (Dialogbox.InvokeRequired) //Если обратились к контролу не из того потока, в котором конрол был создан, то...
                      Dialogbox.Invoke((Action)Thinks); //Вызываем этот же метод через Invoke
                    else
                 {
                     answer(additionalText);
                 }
                }
                else
                {
                    if (Dialogbox.InvokeRequired) //Если обратились к контролу не из того потока, в котором конрол был создан, то...
                        Dialogbox.Invoke((Action)Thinks); //Вызываем этот же метод через Invoke
                    else
                    {
                       //работаем с другим компонентом этой формы
                    }
                    
                }
            }
//======================================================
        private void answer(string additionalText)
{
                    var start = Dialogbox.Text.Length;
                    var length = additionalText.Length;
                    Random random = new Random();
                    Dialogbox.AppendText(additionalText);
                    Dialogbox.Select(start, length);
                    Dialogbox.SelectionAlignment = HorizontalAlignment.Right;

                    Dialogbox.Select();
                    Dialogbox.Select(Dialogbox.Text.Length, 0);
                    Dialogbox.ScrollToCaret();
}

    }
}

Причиной того что окно подвисает во время выполнения скорее всего в том что смысла в моем коде как в куске *****...
Скорее всего (я уверен на 70% с небольшим) что метод Invoke вторгается в поток формы, поэтому функция выполняется два раза (первый в фоне, второй после вызова Th в Invoke) и повторно делает вычисления.
Бред в том что если делать эту проверку в answer, то я не смогу получить строку на выход.
Остается тогда извращаться: добавлять переменную, которая будет регулировать второй вход и пропускать вычисления.
__________________
P.S.: Если что я этого не говорил
(Offline)
 
Ответить с цитированием