2015-01-17 18 views
1

Что такое правильный способ использования Singleton шаблон с QObject который будет использоваться с многопоточным? Конечно, этот способ должен исключить все ошибки Qt многопоточных какQt Многопоточный QObject singleton

QObject: Невозможно создать ребенок для родителей, который находится в другом потоке.

ответ

0

Я не думаю, что существует общепринятый правильный способ сделать это. Проблема в том, что шаблон Singleton избегается в современном программном обеспечении, поскольку наличие глобальной ссылки на определенный объект делает модульное тестирование действительно трудным, иногда невозможным.

Не поймите меня неправильно, это нормально, если у вас есть синглеты, где это кажется логичным. Проблема заключается в шаблоне, когда вы обращаетесь к ним через глобальную переменную или функцию вроде MySingletonClass::getInstance().

Попробуйте ввести его вместо этого там, где это необходимо с помощью параметра конструктора или методов сеттера.

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

+0

Один пример - мой синглтон - это сетевое соединение, которое должно быть уникальным экземпляром. Я хочу использовать его одновременно, чтобы избежать зависаний gui, но у меня ошибка, которую я написал в вопросе. Люди в stackoverflow говорят: «Создайте объект в куче и ...», но он является одиночным, я не могу создать его в куче +, он должен быть уникальным. –

+0

Это нормально. У вас может быть это uniqe, без проблем. Вы можете создать его в куче, почему бы и нет? Исследование предмета о одиночных играх. Поймите, что наличие синглтона отличается от использования singleton _pattern_. Это может быть хорошей отправной точкой: [link] (http://stackoverflow.com/questions/7267061/alternatives-to-singletons). –

0

Сообщение об ошибке времени выполнения относится к Qt, а не к C++. Конечно, вы можете использовать объект, созданный на другом потоке каждый раз, вы хотите. НО вы не можете передать его в качестве родителя (то есть Qt) для объектов, созданных в другом потоке, чтобы родитель не мог уничтожить своих детей, а сам был разрушен. Это также связано с механизмом обмена сообщениями Qt и таймерами. Вы также можете найти описание QObject::moveToThread.

Смежные вопросы