Почему мое приложение qt зависает после нажатия на сенсорный экран? - PullRequest
0 голосов
/ 03 февраля 2020

У меня большая проблема с моим приложением qt, которое я разрабатывал. Версия qt 5.9, сборка в qt creator 4.2.1 и кросс-компилятор для платы Imx6 Linux.

Linux из Imx6 был собран с Yocto 2.4, а версия ядра - 4.9.

Мое приложение qt - это большой проект, со spi-связью, обновлением даты и времени с драйвером rt c, используйте qcustomplot для рисования кривых в реальном времени, используйте файлы таблиц стилей, используйте аудио с pulseaudio.

Я не могу показать свой код, потому что это огромный проект, но в двух словах, приложение считывает данные из памяти, связанной spi, и показывает эти данные в кривых, используя qcustomplot. Приложение показывает дату и время из системы, и пользователь может их изменить.

Приложение работает, но через несколько минут приложение полностью зависает, когда пользователь касается экрана (сенсорный экран). Я прочитал много постов на разных форумах, и у многих людей была эта проблема «заморозки», но я не нашел решения нигде, прочитав, что это может быть тупик, потому что программа где-то заблокирована где-то , Когда я использую мышь вместо сенсорного экрана, проблема «зависания» не возникает. Я распечатал QEvents с помощью qDebug и заметил, что когда я касаюсь Qt, получаю событие сенсорного экрана как события QMouse.

Y отлаживает приложение от создателя qt, и когда программа "зависает" в создателе qt, я вижу следующее потоки в обратном следе:

1 futex_wait_cancelable futex-internal.h 88 0x76437a24
2 __pthread_cond_wait_common pthread_cond_wait.c 502 0x76437a24 
3 __pthread_cond_wait pthread_cond_wait.c 655 0x76437a24 
4 _XReply xcb_io.c 590 0x7580cd90 
5 _XSeqSyncFunction XlibInt.c 203 0x7580f544 
6 _XError XlibInt.c 1436 0x7580ee70 
7 handle_error xcb_io.c 199 0x7580bcb8 
8 handle_response xcb_io.c 311 0x7580bd6c 
9 _XReply xcb_io.c 640 0x7580cd58 
10 _XSeqSyncFunction XlibInt.c 203 0x7580f544 
11 _XError XlibInt.c 1436 0x7580ee70
12 handle_error xcb_io.c 199 0x7580bcb8 
13 handle_response xcb_io.c 311 0x7580bd6c 
14 _XReply xcb_io.c 640 0x7580cd58 
15 _XSeqSyncFunction XlibInt.c 203 0x7580f544 
16 _XError XlibInt.c 1436 0x7580ee70 
17 handle_error xcb_io.c 199 0x7580bcb8 
18 handle_response xcb_io.c 311 0x7580bd6c 
19 _XReply xcb_io.c 640 0x7580cd58
20 _XSeqSyncFunction XlibInt.c 203 0x7580f544 
21 _XError XlibInt.c 1436 0x7580ee70 
22 handle_error xcb_io.c 199 0x7580bcb8 
23 handle_response xcb_io.c 311 0x7580bd6c 
24 _XReply xcb_io.c 640 0x7580cd58 
25 _XSeqSyncFunction XlibInt.c 203 0x7580f544 
26 _XError XlibInt.c 1436 0x7580ee70 
27 handle_error xcb_io.c 199 0x7580bcb8 
28 handle_response xcb_io.c 311 0x7580bd6c 
29 _XReply xcb_io.c 640 0x7580cd58 
30 _XSeqSyncFunction XlibInt.c 203 0x7580f544 
31 _XError XlibInt.c 1436 0x7580ee70 
32 handle_error xcb_io.c 199 0x7580bcb8 
33 handle_response xcb_io.c 311 0x7580bd6c 
34 _XReply xcb_io.c 640 0x7580cd58 
35 _XSeqSyncFunction XlibInt.c 203 0x7580f544 
36 XIAllowTouchEvents XIAllowEvents.c 91 0x736a3c3c 
37 QHash<int, QPointF>::operator[] qhash.h 750 0x734f45f0 
38 QXcbConnection::xi2ProcessTouch qxcbconnection_xi2.cpp 722 0x734f45f0
39 QXcbConnection::xi2HandleEvent qxcbconnection_xi2.cpp 580 0x734f4c1c 
40 QXcbConnection::handleXcbEvent qxcbconnection.cpp 1250 0x734d608c 
41 QVector<bool ( *)(QXcbConnection *, xcb_generic_event_t *)>::resize qvector.h 416 0x734d6480 
42 QVector<bool ( *)(QXcbConnection *, xcb_generic_event_t *)>::clear qvector.h 420 0x734d6480 
43 QXcbConnection::processXcbEvents qxcbconnection.cpp 1743 0x734d6480 
44 QObject::event qobject.cpp 1255 0x765fad14 
45 QApplicationPrivate::process_cmdline qapplication.cpp 488 0x76c5ce88 
46 ?? 0x3de9f0

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

Любое предложение или идея, что я могу справиться с этой ошибкой.

...