|
С# Средство разработки на платформе .Net |
09.02.2014, 21:06
|
#16
|
Оператор ЭВМ
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Многопоточность.
Так подскажи как правильно. У меня других вариантов нет. Если делать отдельным классом, то из второго класса в класс формы не достучаться без ссылки. Подскажи как ссылку делать на метод/класс и т.д. На тех ресурсах что вы мне давали не раскрывается вопрос решения моей проблемы.
__________________
P.S.: Если что я этого не говорил
|
(Offline)
|
|
09.02.2014, 21:48
|
#17
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Многопоточность.
Так что мешает в конструктор "отдельного класса" передать ссылку на форму?
|
(Offline)
|
|
09.02.2014, 22:14
|
#18
|
Оператор ЭВМ
Регистрация: 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)
|
|
09.02.2014, 22:15
|
#19
|
Оператор ЭВМ
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Многопоточность.
И да: весь мой вопрос заключался в том чтобы вы мне рассказали как ссылку на класс сделать!
Ах да, вот:
Сообщение от pax
ну преобразуй его в Action и метод UpdateForm - это твой метод обновления интерфейса
form.Invoke((Action) (()=>{UpdateForm(param1, param2);}));
...
void UpdateForm(param1, param2) {
}
либо просто
form.Invoke((Action) (()=>{ // код обновления }));
|
Вспомнил про этот пост и сделал так как ты говорил. Теперь не зависает. Но что если я начну рисовать на панели из другого потока? Мне точно нужно знать как сделать ссылку из дочернего класса в главный.
__________________
P.S.: Если что я этого не говорил
|
(Offline)
|
|
09.02.2014, 22:31
|
#20
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Многопоточность.
Invoke надо вызывать для обновления интерфейса, а не для выполнения функции с основной задачей, которая должна быть в отдельном потоке. Т.е. всегда когда настал момент обновить интерфейс - вызываешь Invoke с обновлением данных в контролах, все остальное в отдельном потоке. Т.е. основная задача Invoke - записать например текст в метку или что-то подобное.
PS: в коде я ничего не понял и разбираться нет времени.
|
(Offline)
|
|
10.02.2014, 02:25
|
#21
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Многопоточность.
все переменные на классы и есть ссылки если не указано обратного
|
(Offline)
|
|
10.02.2014, 07:33
|
#22
|
Легенда
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений (для 568 пользователей)
|
Ответ: Многопоточность.
Ребятки, не кормите help-вампира, пускай сначала язык и платформу освоит.
|
(Offline)
|
|
10.02.2014, 15:42
|
#23
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Многопоточность.
Сообщение от pax
Так что мешает в конструктор "отдельного класса" передать ссылку на форму?
|
не красиво как то
|
(Offline)
|
|
10.02.2014, 16:34
|
#24
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Многопоточность.
Сообщение от radiobutton
не красиво как то
|
А что красиво? Использовать статические ссылки или IoC? Все в зависимости от сложности приложения.
|
(Offline)
|
|
10.02.2014, 21:36
|
#25
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Многопоточность.
Сообщение от pax
А что красиво? Использовать статические ссылки или IoC? Все в зависимости от сложности приложения.
|
Передовать делегат/ юзать события.
Но опять же это такое.
|
(Offline)
|
|
11.02.2014, 08:21
|
#26
|
Легенда
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений (для 568 пользователей)
|
Ответ: Многопоточность.
Да нафиг мелочиться, внедряйте сразу MVVM.
Радиокнопка - тролль )
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:41.
|