Потоки
Привіт)
В мене виникла одна проблема і я не знаю як правильно вийти з такої ситуації:
припустим в мене є форма з одною кнопкою (код кліку):
private void Start_Click(object sender, EventArgs e) {
Progress pr = new Progress();
pr.Show();
for (int i = 0; i < 20;i++ ) {
if (pr.closed)
break;
pr.lbl1.Text = i.ToString();
Thread.Sleep(1000);
pr.Update();
}
}
В ній ми створюємо форму Progress pr, на якій знаходиться один public Label lbl1 та кнопка «закрити»,
при кліканні якої глобальна булева змінна форми bool closed стає рівна true. От тепер питання, якщо
ми проходимось по нашому циклі то форма pr буде недоступна, оскільки обробляється вивід цифр
від
8 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівДякую) Почитаю...
proklondike.com/...contentview.php content=460
Можешь почитать книгу “Искусство программирования на C++” Шилдта. В ней в пятой главе рассматривается GUI + многопоточность. Вот ссылка на книгу в электронном виде:
Пробував... Не вийшло. Можливо іншим разом побачу краще вирішення своєї проблеми)
З цим запрацювало:) Дякую!)
если надумаете через потоки не забудьте о синхронизации, хотя бы на уровне критических секций (user mode)
Зробив такий приклад, щоб довго не розписувати що робиться в мене там...
Можливо я в корені щось неправильно задумав. Підкажіть що почитати...))
Тут проблема не в потоках, а в сообщениях, пока вы гоните в цикле, ваше приложение не обрабатывает сообщения винды, поэтому подвисает Гуй...
для обработки не обязательно подорождать отдельный поток, а можно просто переодически в цикле обрабатывать накопившиеся сообщения — нажатие кнопки это тоже сообщение вигды.
В шарпе есть метод DoEvents... это если вы хотите остаться в рамках однопоточной модели... (задержка в таком случае будет разница во времени между вызовами обработчика)
P.S. А похорошему, дизайн конечно стоит пересмотреть. Так как не понятно чего вы добиваетесь
sleep в ГУИшном потоке это вы круто:)