Моя компания рассматривает вопрос о переходе с 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, это полностью освобождает нас от необходимости мета-типов? Если да, то разрешает ли новый синтаксис подключения в очереди? Пожалуйста, прости мое невежество по этому вопросу, но я не вижу его явно в списке поддерживаемых или нет.
Пожалуйста, прости мое невежество по этому вопросу, но я не вижу его явно в списке поддерживаемых или нет.
Это в настоящее время не поддерживается, что означает, что не выгружайте плагины с Qt 5 на момент написания этого. Обычно вы не загружаете и не выгружаете плагины в любом случае, как это обычно делается при запуске. соответствующее изменение в хранилище также утверждается:
Функция не работает должным образом. Он не был хорошо протестирован, например, не определено, как должен вести себя QVariant, если он содержит экземпляр незарегистрированного типа.
Концепция незарегистрированных типов была вдохновлена системой плагинов, но на большинстве поддерживаемых платформ мы не выгружаем плагины.
Идея отмены регистрации типа может блокировать оптимизации в мета-объектной системе, потому что было бы невозможно кэшировать идентификатор типа. QMetaType :: type () может возвращать разные идентификаторы для одного и того же имени.
Таким образом, даже если вы думали, что это работает, это ненадежно, что означает, что вы могли наблюдать, как трудно находить ошибки в его работе, что приводило к ненадежному программному обеспечению с вашей стороны. Я уверен, что вы не хотите выпускать такое программное обеспечение, особенно если оно не рекомендуется для использования Qt Project.