Использование событий QT в деструкторе QApplication - зависание - PullRequest
0 голосов
/ 28 мая 2019

Я работаю с приложением QT GUI, у которого возникают проблемы при обработке событий во время деструктора QApplicaton. Библиотека, которую я использую (которую я не могу изменить), использует QEventLoop. Он записал некоторые данные в сокет и, похоже, ожидает ответа. Отладчик показывает, что QEventDispatcherWin32 :: processEvents зацикливается и загружает процессор.

Мне удалось заставить его работать, удалив некоторые конкретные виджеты ранее. Тем не менее, это кажется немного случайным!

Мы покидаем наш сервер, когда виджет уничтожен. В зависимости от того, какие виджеты созданы, я иногда зависаю, а иногда нет.

Это вызов exec, который зависает -

  m_timedout = false;
  QEventLoop loop;
  QTimer timer;
  timer.setSingleShot(true);
  connect(&timer, SIGNAL(timeout()), this, SLOT(slt_timeout()));
  connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
  timer.start(1800000);
  connect(this, SIGNAL(sig_response(int, int, QByteArray)), &timer, SLOT(stop()));
  connect(this, SIGNAL(sig_response(int, int, QByteArray)), &loop, SLOT(quit()));
  loop.exec(QEventLoop::ExcludeUserInputEvents);

Так что я спрашиваю? Я очень плохо знаком с QT и не понимаю всех концепций, но меня беспокоит, что мы полагаемся на обработку событий QT во время деструктора приложения. Это действительная вещь? Разве QT не начал сворачиваться?

Есть ли что-нибудь еще, что могло бы вызвать это зависание?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...