forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Многопоточность. (http://forum.boolean.name/showthread.php?t=18918)

Dark Dragon 09.02.2014 21:06

Ответ: Многопоточность.
 
Так подскажи как правильно. У меня других вариантов нет. Если делать отдельным классом, то из второго класса в класс формы не достучаться без ссылки. Подскажи как ссылку делать на метод/класс и т.д. На тех ресурсах что вы мне давали не раскрывается вопрос решения моей проблемы.

pax 09.02.2014 21:48

Ответ: Многопоточность.
 
Так что мешает в конструктор "отдельного класса" передать ссылку на форму?

Dark Dragon 09.02.2014 22:14

Ответ: Многопоточность.
 
Подскажи как ссылку делать на метод/класс и т.д. На тех ресурсах что вы мне давали не раскрывается вопрос решения моей проблемы. Вот как выглядит моя программа в общих чертах:
Код:

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, то я не смогу получить строку на выход.
Остается тогда извращаться: добавлять переменную, которая будет регулировать второй вход и пропускать вычисления.

Dark Dragon 09.02.2014 22:15

Ответ: Многопоточность.
 
И да: весь мой вопрос заключался в том чтобы вы мне рассказали как ссылку на класс сделать!
Ах да, вот:
Цитата:

Сообщение от pax (Сообщение 273854)
ну преобразуй его в Action и метод UpdateForm - это твой метод обновления интерфейса

PHP код:

form.Invoke((Action) (()=>{UpdateForm(param1param2);}));

...

void UpdateForm(param1param2)
{



либо просто
PHP код:

form.Invoke((Action) (()=>{
// код обновления
})); 



Вспомнил про этот пост и сделал так как ты говорил. Теперь не зависает. Но что если я начну рисовать на панели из другого потока? Мне точно нужно знать как сделать ссылку из дочернего класса в главный.

pax 09.02.2014 22:31

Ответ: Многопоточность.
 
Invoke надо вызывать для обновления интерфейса, а не для выполнения функции с основной задачей, которая должна быть в отдельном потоке. Т.е. всегда когда настал момент обновить интерфейс - вызываешь Invoke с обновлением данных в контролах, все остальное в отдельном потоке. Т.е. основная задача Invoke - записать например текст в метку или что-то подобное.

PS: в коде я ничего не понял и разбираться нет времени.

Dream 10.02.2014 02:25

Ответ: Многопоточность.
 
все переменные на классы и есть ссылки если не указано обратного

johnk 10.02.2014 07:33

Ответ: Многопоточность.
 
Ребятки, не кормите help-вампира, пускай сначала язык и платформу освоит.

radiobutton 10.02.2014 15:42

Ответ: Многопоточность.
 
Цитата:

Сообщение от pax (Сообщение 274071)
Так что мешает в конструктор "отдельного класса" передать ссылку на форму?

не красиво как то :-D

pax 10.02.2014 16:34

Ответ: Многопоточность.
 
Цитата:

Сообщение от radiobutton (Сообщение 274099)
не красиво как то :-D

А что красиво? Использовать статические ссылки или IoC? Все в зависимости от сложности приложения.

radiobutton 10.02.2014 21:36

Ответ: Многопоточность.
 
Цитата:

Сообщение от pax (Сообщение 274102)
А что красиво? Использовать статические ссылки или IoC? Все в зависимости от сложности приложения.

Передовать делегат/ юзать события.

Но опять же это такое.:)

johnk 11.02.2014 08:21

Ответ: Многопоточность.
 
Да нафиг мелочиться, внедряйте сразу MVVM.

Радиокнопка - тролль )


Часовой пояс GMT +4, время: 07:54.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot