2012-04-19 1 views
1

Я хотел создать QObject (объекта) с ребенком QThread (нити) с тем, что объектом в качестве родителя (для хранения нити жив в то время как объект жив) и сделать object.moveToThread(thread), но сигнал, чтобы начать нить не работает в этом случае.QObject.moveToThread (нить), если поток является потомком этого объекта

Просто:

  1. объект владеет нить
  2. объект перемещается в нить
  3. сигнал запуска нить не работает

Что происходит?

+0

Можете ли вы показать инструкцию connect()? Кроме того, вы пробовали, если он возвращает true? –

+0

@Tim Meyer, * «Кроме того, вы пробовали, если он возвращает true?» * Да, он возвращает true. Если я устанавливаю другой 'QObject' как родительский поток - это нормально, и все работает. –

+0

@Tim Meyer, я создал функцию ('object.start()'), которая испускает 'начальный()' сигнал от * объекта *, а также я подключил * объект * ''start()' signal to 'start()' слот * потока *. И я начинаю thread с вызова функции 'object.start()'. Испускать сигнал 'object.started()' во всех случаях хорошо, но 'thread' запускается, только если он является дочерним по отношению к ** другому **' QObject'. –

ответ

1

[Изменить]: Отбрасывая мой первоначальный ответ из-за замечаний

Может быть, сделать это как следующий:

  1. Создание объекта
  2. Создать тему, но не назначайте родитель к нему
  3. Подключить сигнал конца Thread() к его слоту deleteLater(), как обычно
  4. Подключить сигнал объекта() к столу потока p() slot

Затем, когда вы удаляете объект, он будет удалять(), который остановит поток. Поток будет выдавать final(), который будет вызывать его слот deleteLater().

+0

@Tym Meyer, * «TestObject владеет нитью» * - Я не знаю C++ и не могу проверить этот код, но я понимаю некоторые части вашего кода выше. Возможно, я ошибаюсь, но когда мы создаем поток, который должен принадлежать некоторым Obj, мы делаем QThread (parent = Obj), а затем поток принадлежит Obj. Или если мы напрямую вызываем thread.setParent (Obj) - это то же самое. В вашем случае объект не принадлежит нитью, но имеет поток как аргумент сам по себе. Я уже думал об этом, и мне это не нужно. –

+0

О, я забыл ваш тэг pyqt, извините. На самом деле это не работает, когда я устанавливаю родителя. В Qt для C++ каждый объект QObject может иметь родительский элемент, но это не обязательно. Разве это отличается от PyQt? –

+0

Нет, это не имеет никакого смысла. Но мне нужно установить родительский ключ 'QObject' в качестве контейнера для потоков с классным интерфейсом' th = container.findChild (QThread, name = "awesom_thread_56") 'и когда я вызываю' thread.setParent (0) ', то, возможно, поток автоматически удалит из контейнера деструктором. Или, если я просто удаляю thread - он удаляет из родительского дочернего элемента QObject. Если нет ссылок на поток, то он полностью удаляется. Также полезно, чтобы управление памятью связывало поток 'finished()' потока с потоком 'deleteLater' в потоке. Тогда может произойти волшебство с иерархическими объектами –