Opened 8 years ago

Closed 8 years ago

Last modified 7 years ago

#233 closed баг (fixed)

Очень долгое завершение программы

Reported by: alx Owned by: dimag
Priority: minor Milestone: 2 очередь
Component: ПО MC04-Dispatcher. Пульт диспетчера/техника Keywords: тормоза, threads
Cc: san

Description

r252: нажимаю кнопку "закрыть" окна приложения. Реакции приложения на это никакой нет. Window manager говорит, что приложение не отвечает, содержимое окна не перерисовывается. При этом в консоль продолжают выводиться сообщения об обработанных ESL событиях, как будто программа продолжает работать как ни в чем не бывало.

Пока писал этот тикет, приложение все-таки завершилось без каких-либо сообщений об ошибках. Похоже, завершение программы может длиться от одной секунды до, возможно, нескольких минут. Чаще секунд 10. Что-то здесь не так...

Change History (14)

comment:1 by dimag, 8 years ago

Долго закрывается SIP-соединение?
У меня не были замеченны такие долгие задержки.

in reply to:  1 comment:2 by alx, 8 years ago

Replying to dimag:

Долго закрывается SIP-соединение?

Нет. Никаких соединений не было установлено (входил как техник).

Могу подтвердить, что в r266 эффект есть - от нажатия "закрыть" до завершения программы прошло 2.5 минуты.

comment:3 by dimag, 8 years ago

SIP соединение было, программы с FreeSwitch сервером.

comment:4 by dimag, 8 years ago

r270. Причина наверно в том,что я дважды закрывал поток RecordsObject, один раз в MainAppFrameWindow3, другой раз в функции main, под Windows это не оказывает влияние, но под Linux может сильно замедлить завершение программы.

comment:5 by dimag, 8 years ago

Resolution: fixed
Status: newclosed

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

Resolution: fixed
Status: closedreopened

Replying to dimag:

SIP соединение было, программы с FreeSwitch сервером.

  1. И с каким же SIP URI был соединен техник?
  2. Если SIP-соединение было, почему оно не отображалось на экране?

Или Вы SIP регистрацию называете соединением?

Replying to dimag:

r270. Причина наверно в том,что я дважды закрывал поток RecordsObject?, один раз в MainAppFrameWindow3, другой раз в функции main, под Windows это не оказывает влияние, но под Linux может сильно замедлить завершение программы.

Вот Вы не убедились в том, что проблема решена, а поспешили закрыть тикет с резолюцией fixed. В r270 проблема по-прежнему есть (27 секунд прошло от нажатия до завершения).

comment:7 by dimag, 8 years ago

Задержка происходит под Linux при выполнение кода следующей функции:
void MainAppFrameWindow3::closeEvent(QCloseEvent *event)
{

QMainWindow::closeEvent(event);
ptelephonedlg->close();
EventThread.exit(0);
CommandThread.exit(0);
RecordsThread.exit(0);
EventThread.wait();задержка
CommandThread.wait();
задержка
RecordsThread.wait();задержка

}
Который я переписал из-за предупреждений о некорректно завершаемых потоках.
В первоначальном варианте где было только

QMainWindow::closeEvent(event);
ptelephonedlg->close();

не было замедления, но были предупреждения.
Может удалить строки с ожиданиями?

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

Replying to dimag:

Может удалить строки с ожиданиями?

Это называется спрятать проблему под ковер. :) Может лучше для начала выяснить, что за работу поток выполняет так долго после получения программой команды завершения?

comment:9 by dimag, 8 years ago

Keywords: threads added
Resolution: fixed
Status: reopenedclosed

r275

Как оказалось под linux объект EventThread завершается долго, не хочет закрываться сразу. В новой версии я закрываю этот поток в цикле считывания сообщений по сигналу в глобальной переменной bExitSignal.
Я тестировал работу программы в версии по Ubuntu на моём моноблоке, все теперь завершается быстро, без ожидания завершения потока.

comment:10 by alx, 8 years ago

Resolution: fixed
Status: closedreopened

Не помогло. Только что программа завершалась 36 секунд.
Заметил, что в процессе завершения загрузка CPU была близка к нулю. Непонятно, почему завершение EventThread длится так долго, если при этом он не выполняет полезной работы...

comment:11 by dimag, 8 years ago

Resolution: fixed
Status: reopenedclosed

r285
Изменил логику завершения программы.
Пробовал у себя на убунту несколько раз, всё завершалось очень быстро.

comment:12 by dimag, 8 years ago

r289
Там всё работает намного лучше и закрывается очень быстро

in reply to:  11 comment:13 by alx, 8 years ago

Replying to dimag:

r285
Изменил логику завершения программы.
Пробовал у себя на убунту несколько раз, всё завершалось очень быстро.

Подтверждаю, в r285 проблема пропала.

У меня тоже мысли были вокруг EventsTimer.stop(), но я не смог найти правильного места, где это надо делать (мои эксперименты не дали положительного результата)...

Replying to dimag:

r289
Там всё работает намного лучше и закрывается очень быстро

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

comment:14 by san, 7 years ago

Milestone: Текущее2 очередь

Milestone renamed

Note: See TracTickets for help on using tickets.