2016-09-23 9 views
0

Я переписал вопрос, чтобы он стал более понятным.Создание нового Qapplication из цикла событий Qapplication

В моем коде я создал QApplication, подключив слот к приложению с помощью QTimer.singleShot(), а затем выполнил мое приложение.

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

Я знаю, что это не обычная реализация, но было бы намного проще добиться этого в моем случае.

Вот пример кода: Ошибки я получаю «QCoreApplication :: Exec: Петля события уже работает»

import multiprocessing 
from PyQt4 import QtCore,QtGui 

def first_app_slot(): 
    mProcess = multiprocessing.Process(target = run_another_app) 
    mProcess.start() 
    mProcess.join() 

def run_another_app(): 
    second_app = QtGui.QApplication([]) 
    second_app.exec_() 

if __name__ == "__main__": 
    first_app = QtGui.QApplication([]) 
    QtCore.QTimer.singleShot(0,first_app_slot) 
    first_app.exec_() 
+0

, пожалуйста, внесите свой код! – HazemGomaa

+2

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

+0

Извините за это, я переписал вопрос, спасибо за ваши отзывы. –

ответ

0

Несколько проблем

  1. В своем коде, вы не называете код мультипроцессорности (может быть, опечатку)?

  2. Не создайте первый QApplication в глобальной области действия, поместите его внутри функции. Перед созданием нового процесса multiprocessing скопирует глобальное состояние в новый процесс, который в данном случае включает first_app.

Ex.

def main(): 
    first_app = QtGui.QApplication(sys.argv) 
    ... 

if __name__ == '__main__': 
    main() 
+0

Да, это была опечатка, извините за это, я попробовал решение, которое вы предложили, но оно не работает. Я думаю, проблема в том, что новый процесс создается как дочерний процесс из QApp или что-то еще, поэтому даже если ссылка на приложение (first_app) был удален, QApp все еще живет в этом процессе и, например, может быть получен с использованием QCoreApplication.instance(), я хочу, чтобы этот процесс выполнялся полностью независимо от QApp. –

+0

Я знаю, что логическое решение для моего дела будет состоять в том, чтобы сначала создать процессы, а затем запустить QApp каждый в своем процессе, но по какой-то причине я застрял в своем случае. –