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 dimag, 8 years ago

Resolution: fixed
Status: newclosed

rev 227

comment:2 by alx, 8 years ago

Resolution: fixed
Status: closedreopened

Проведен эксперимент - попытка входа на хост, который просто не отвечает. Результат - после нажатия кнопки "Вход" интерфейс "завис" на 2 минуты. И неудивительно, ведь mysql_real_connect() вызывается прямо из CStartupDlg::ConnectButton_pressed(), то есть в GUI-потоке...

comment:3 by dimag, 8 years ago

Resolution: wontfix
Status: reopenedclosed

Разделение логики работы программы на потоки было сделанно только для основного окна приложения. Для диалога вход вся работа с сетью производиться в основном потоке программы, так к было задуманно.

comment:4 by alx, 8 years ago

Так было задумано кем?

Я считаю, что описанное в #comment:2 поведение программы задумано плохо, и решение о таком поведении ошибочно. Считаю, что надо перезадумать.

comment:5 by san, 8 years ago

Milestone: Текущее1 очередь
Priority: majorblocker
Resolution: wontfix
Status: closedreopened
Type: улучшениебаг

Алексей напомнил об этом тикете, и я обнаружил, что он был закрыт как вонтфикс.
Прошу прощения, пропустил.
Согласен с тикетом. Интерфейсный поток должен быть развязан от функций требующих длительного времени для обработки.

так к было задуманно

Не было задумано, а даже были длительные разговоры, в которых обсуждалось почему это плохо. И ты, Дмитрий, даже переделывал программу длительное время, чтобы вынести сетевые функции в отдельные потоки.

прецеденты
1. ведь mysql_real_connect() вызывается прямо из CStartupDlg::ConnectButton_pressed(), то есть в GUI-потоке...
(comment:2)

2.Да, я обращаюсь к SSH в главном потоке программы.
(#369)

Алексей, если знаешь ещё - напиши пожалуйста.

comment:6 by dimag, 8 years ago

Keywords: threads SSH added
Resolution: fixed
Status: reopenedclosed

r397.
Первый прецедент исправлен.
По второму, я установил время ожидания для соединения SSH в 1 секунду, то есть главный поток подвиснет не более чем 1 секунду, это пользователь может пережить.

in reply to:  6 comment:7 by alx, 8 years ago

Replying to dimag:

это пользователь может пережить.

А зачем ему это "переживать", если можно сделать так, чтобы ничего "переживать" не пришлось - просто не блокировать интерфейсный поток на время ожидания ответа из сети?

comment:8 by alx, 8 years ago

Resolution: fixed
Status: closedreopened

В r397 воспроизвел проблему тикета #369. Интерфейс "заморозился" совсем не на 1 секунду, а навсегда (пока не убил процесс). Таким образом, заявленная в этом тикете проблема не устранена.

comment:9 by dimag, 8 years ago

Resolution: fixed
Status: reopenedclosed

r407
Вынес работу по протоколу SSH в отдельный поток

Note: See TracTickets for help on using tickets.