Потоки

Привіт)

В мене виникла одна проблема і я не знаю як правильно вийти з такої ситуації:

припустим в мене є форма з одною кнопкою (код кліку):

		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 буде недоступна, оскільки обробляється вивід цифр

від 0–20 на ній... Як зробити, щоб при натисканні кнопки закрити можна було вийти з циклу виводу цифр???

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Можливо я в корені щось неправильно задумав. Підкажіть що почитати...))

Можешь почитать книгу “Искусство программирования на C++” Шилдта. В ней в пятой главе рассматривается GUI + многопоточность. Вот ссылка на книгу в электронном виде:


P.S. А похорошему, дизайн конечно стоит пересмотреть.

Пробував... Не вийшло. Можливо іншим разом побачу краще вирішення своєї проблеми)

В шарпе есть метод DoEvents...

З цим запрацювало:) Дякую!)

если надумаете через потоки не забудьте о синхронизации, хотя бы на уровне критических секций (user mode)

Я його вставив замість іншої функції, яка в мене працює відносно довго (зчитує екзіф дані з jpg).
Зробив такий приклад, щоб довго не розписувати що робиться в мене там...

Можливо я в корені щось неправильно задумав. Підкажіть що почитати...))

По коду похоже что Шарп,
Тут проблема не в потоках, а в сообщениях, пока вы гоните в цикле, ваше приложение не обрабатывает сообщения винды, поэтому подвисает Гуй...
для обработки не обязательно подорождать отдельный поток, а можно просто переодически в цикле обрабатывать накопившиеся сообщения — нажатие кнопки это тоже сообщение вигды.
В шарпе есть метод DoEvents... это если вы хотите остаться в рамках однопоточной модели... (задержка в таком случае будет разница во времени между вызовами обработчика)

P.S. А похорошему, дизайн конечно стоит пересмотреть. Так как не понятно чего вы добиваетесь

sleep в ГУИшном потоке это вы круто:)

Підписатись на коментарі