Opened 8 years ago
Closed 8 years ago
#183 closed баг (fixed)
Убрать всю бизнес-логику из GUI потока в отдельный поток
Reported by: | alx | Owned by: | dimag |
---|---|---|---|
Priority: | blocker | Milestone: | 1 очередь |
Component: | ПО MC04-Dispatcher. Пульт диспетчера/техника | Keywords: | threads, SSH |
Cc: | san |
Description
Это уже обговаривалось устно, но я решил создать тикет, чтобы не было забыто.
Сейчас многие функции, выполнение которых может занять значительное время, выполняются в GUI потоке. В результате интерфейс пользователя "замерзает" на время их выполнения, что является очень раздражающим для пользователя, ибо выглядит так, будто программа "зависла". Например, если хост, к которому программа подключается, выключен, то при нажатии кнопки "Вход" интерфейс будет заморожен на длительное время (около минуты!), пока программа пытается соединиться с хостом.
В интерфейсном потоке, насколько это возможно, должны выполняться только функции, связанные с интерфейсом - т.е. обработка событий, обновление элементов на экране. Все функции, которые могут потребовать хоть сколько-нибудь длительного времени, должны быть вынесены в другие потоки. И уж точно в GUI-потоке не должны выполняться вызовы, приводящие к засыпанию потока (connect(), read() в блокирующем режиме и т.п.).
Change History (9)
comment:1 by , 8 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
comment:2 by , 8 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
Проведен эксперимент - попытка входа на хост, который просто не отвечает. Результат - после нажатия кнопки "Вход" интерфейс "завис" на 2 минуты. И неудивительно, ведь mysql_real_connect() вызывается прямо из CStartupDlg::ConnectButton_pressed(), то есть в GUI-потоке...
comment:3 by , 8 years ago
Resolution: | → wontfix |
---|---|
Status: | reopened → closed |
Разделение логики работы программы на потоки было сделанно только для основного окна приложения. Для диалога вход вся работа с сетью производиться в основном потоке программы, так к было задуманно.
comment:4 by , 8 years ago
Так было задумано кем?
Я считаю, что описанное в #comment:2 поведение программы задумано плохо, и решение о таком поведении ошибочно. Считаю, что надо перезадумать.
comment:5 by , 8 years ago
Milestone: | Текущее → 1 очередь |
---|---|
Priority: | major → blocker |
Resolution: | wontfix |
Status: | closed → reopened |
Type: | улучшение → баг |
Алексей напомнил об этом тикете, и я обнаружил, что он был закрыт как вонтфикс.
Прошу прощения, пропустил.
Согласен с тикетом. Интерфейсный поток должен быть развязан от функций требующих длительного времени для обработки.
так к было задуманно
Не было задумано, а даже были длительные разговоры, в которых обсуждалось почему это плохо. И ты, Дмитрий, даже переделывал программу длительное время, чтобы вынести сетевые функции в отдельные потоки.
прецеденты
1. ведь mysql_real_connect() вызывается прямо из CStartupDlg::ConnectButton_pressed(), то есть в GUI-потоке...
(comment:2)
2.Да, я обращаюсь к SSH в главном потоке программы.
(#369)
Алексей, если знаешь ещё - напиши пожалуйста.
follow-up: 7 comment:6 by , 8 years ago
Keywords: | threads SSH added |
---|---|
Resolution: | → fixed |
Status: | reopened → closed |
r397.
Первый прецедент исправлен.
По второму, я установил время ожидания для соединения SSH в 1 секунду, то есть главный поток подвиснет не более чем 1 секунду, это пользователь может пережить.
comment:7 by , 8 years ago
Replying to dimag:
это пользователь может пережить.
А зачем ему это "переживать", если можно сделать так, чтобы ничего "переживать" не пришлось - просто не блокировать интерфейсный поток на время ожидания ответа из сети?
comment:8 by , 8 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
comment:9 by , 8 years ago
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
r407
Вынес работу по протоколу SSH в отдельный поток
rev 227