Реклама

Поиск

QML - Урок 023. Охота за багами при передаче указателя на QObject в QML

TutorialQMLQt, QML, указатель, JavaScriptOwnership, pointer, bug94

Одними из самых мерзких и мало предсказуемых багов являются те, которые возникают в неопределённый момент времени. К числу таких можно отнести баг, который проявляется при передаче указателя на QObject в QML слой. Проблема заключается в том, что если у QObject отсутствует родитель, то при передаче в слой QML происходит смена владельца объекта, то есть ему устанавливается JavaScriptOwnership. В итоге, когда в QML слое пропадут все ссылки на данный объект, то он будет удалён сборщиком мусора QML. Соответственно, все ссылки в C++ слое окажутся невалидными. А приложение при попытке обращения по этим ссылкам молча схлопнется, ничего не сообщив о причине краха.

Говоря о неопределённости срабатывания бага, необходимо отметить, что эта неопределённость произрастает из момента сборки мусора. В обычном варианте этот момент может наступить тогда, когда программа откушает пару гигабайт памяти или когда памяти будет не хватать и её можно будет получить, произведя сборку мусора. То есть приложение может без проблем работать достаточно долго без проявления бага, и даже возможно пережить несколько версий, прежде чем баг проявится у какого-нибудь пользователя, который решит сообщить об этом разработчикам.

Стоит отметить, что данное правило не будет применяться к объектам объявленным в качестве Q_PROPERTY.

Но для демонстрации проблемы можно воспользоваться QML функцией gc() , которая ускорит сборку мусора.

XGrabKey

TutorialXlibHotKey, linux, X11, XGrabKey116

Синтаксис

XGrabKey(display, keycode, modifiers, grab_window, owner_events, pointer_mode, keyboard_mode)
      Display *    display;
      int          keycode;
      unsigned int modifiers;
      Window       grab_window;
      Bool         owner_events;
      int          pointer_mode, keyboard_mode;

Аргументы

display	        // Указывает соединение с X Сервером
keycode	        // Указывает код клавиши (KeyCode) или любой код (AnyKey)
modifiers       // Указывает установку конкретных масок модификаторов 
                // или использование любых модификаторов (AnyModifier). 
                // Маска является поразрядным ИЛИ для проверки битов маски.
grab_window     // Указывает захватываемое окно
owner_events    // Указывает значение Boolean, которое указывает на события клавиатуры, 
                // будут ли представлены как обычно.
pointer_mode    // Описывает дальнейший способ обработки событий указателя мыши.
                // Вы можете передавать GrabModeSync или GrabModeAsync.
keyboard_mode	// Описывает дальнейший способ обработки событий клавиатуры. 
                // Вы можете передавать GrabModeSync or GrabModeAsync.

Реклама

Реклама