Методы класса будут выполняться в контексте потока, который их вызывает. Если вы переместите класс QObject в поток (давайте назовем его рабочим потоком), то только методы этого класса, которые вызываются напрямую (или косвенно) из метода run()
рабочего потока, будут выполняться в контексте рабочая нить.
Если вы хотите вызывать методы этого класса из какого-то другого потока, но при этом все же запускать их в контексте рабочего потока, вам нужен какой-то способ передать сообщение в рабочий поток, чтобы он мог вызывать метод, который вы хочу. По сути, это то, что достигается сигналами и слотами Qt при пересечении границ потоков.
Имея много дополнительной работы, есть два других способа сделать то же самое. Во-первых, QThread
s имеет цикл обработки событий, который запускается по умолчанию, если вы не переопределите run()
. Вы можете создать пользовательских событий , которые вы можете опубликовать в цикле событий, который может инициировать действия в вашем классе, которые будут выполняться в контексте рабочего потока.
Вторым способом будет вызов методов в вашем классе из другого потока, которые изменяют поля класса, которые отслеживает рабочий поток. Вы должны быть уверены, что доступ к любому из этих полей синхронизирован с некоторым механизмом, таким как мьютекс.