Обработка регистрации QMetaType в Qt5 с помощью динамических плагинов

Моя компания рассматривает вопрос о переходе с Qt 4.8.4 на Qt 5.4, но я натолкнулся на изменение, которое может стать для нас показателем: QMetaType::unregisterType() устранен (http://doc.qt.io/qt-5/sourcebreaks.html).

Наш GUI требует, чтобы плагины загружались во время выполнения, при этом один и тот же плагин потенциально загружался и выгружался более одного раза во время сеанса GUI. В Qt 4 мы столкнулись с проблемой, когда при повторной загрузке подключаемого модуля любой сигнал / слот, который использовал один из пользовательских типов, зарегистрированных подключаемым модулем, вызывал нарушения прав доступа, поскольку мета-тип был зарегистрирован первый экземпляр плагина (который теперь был выгружен, поэтому пространство памяти было недопустимым). Мы решили эту проблему, определив собственные макросы для безопасной регистрации и отмены регистрации метатипов при загрузке и выгрузке плагина.

С QMetaType::unregisterType() Я боюсь, что этот вопрос вернется без реального способа решения проблемы. Обновление до Qt 5.4 было бы значительным капиталовложением даже для того, чтобы я смог протестировать эту проблему, поэтому я надеюсь, что смогу получить некоторую информацию от экспертов здесь.

Есть ли способ отменить регистрацию мета-типа в Qt 5? Если нет, то есть ли в Qt 5 какая-то система, которая может обнаружить, когда DLL выгружается, и отменить регистрацию мета-типов сама (весьма маловероятно, я бы предположил)? В качестве альтернативы, если мы перейдем к новому синтаксису сигнал / слот Qt 5, это полностью освобождает нас от необходимости мета-типов? Если да, то разрешает ли новый синтаксис подключения в очереди? Пожалуйста, прости мое невежество по этому вопросу, но я не вижу его явно в списке поддерживаемых или нет.

4

Решение

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

Это в настоящее время не поддерживается, что означает, что не выгружайте плагины с Qt 5 на момент написания этого. Обычно вы не загружаете и не выгружаете плагины в любом случае, как это обычно делается при запуске. соответствующее изменение в хранилище также утверждается:

Функция не работает должным образом. Он не был хорошо протестирован, например, не определено, как должен вести себя QVariant, если он содержит экземпляр незарегистрированного типа.

Концепция незарегистрированных типов была вдохновлена ​​системой плагинов, но на большинстве поддерживаемых платформ мы не выгружаем плагины.

Идея отмены регистрации типа может блокировать оптимизации в мета-объектной системе, потому что было бы невозможно кэшировать идентификатор типа. QMetaType :: type () может возвращать разные идентификаторы для одного и того же имени.

Таким образом, даже если вы думали, что это работает, это ненадежно, что означает, что вы могли наблюдать, как трудно находить ошибки в его работе, что приводило к ненадежному программному обеспечению с вашей стороны. Я уверен, что вы не хотите выпускать такое программное обеспечение, особенно если оно не рекомендуется для использования Qt Project.

1

Другие решения


По вопросам рекламы [email protected]