<div dir="ltr"><div dir="ltr">As far as I know, slots are called in the same sequence they're connected to.<br>But I'm afraid that's not the issue here. As pointed out by Phil and the good and omnipresent eyllanesc on stackoverflow, you're misunderstanding how signal/slot work: once a signal is fired, the "control" is returned only as soon as the slot returns it.<div><br></div><div>If you've a long/heavy process in the slot, the UI won't react until that process has finished. The only alternative is to use threads (both via Python or QThreads).<br><br>In similar scenarios I usually create a subclassed QObject with a Python Queue, create a QThread in the parent object, use object.moveToThread(createdThread), then connect the started() signal of the thread to the "worker" method of the QObject and finally push "messages" to the Queue to let the QObject relate with them.<br><br>Let's see a very simple example:</div><div><br></div><div><div><font face="monospace, monospace">from time import sleep</font></div><div><font face="monospace, monospace">from Queue import Queue</font></div><div><span style="font-family:monospace,monospace">from PyQt5 import QtCore, QtWidgets</span><br></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">class Worker(QtCore.QObject):</font></div><div><font face="monospace, monospace">    working = QtCore.Signal(bool)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    def __init__(self):</font></div><div><font face="monospace, monospace">        QtCore.QObject.__init__(self)</font></div><div><font face="monospace, monospace">        self.queue = Queue()</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    def run(self):</font></div><div><font face="monospace, monospace">        while True:</font></div><div><font face="monospace, monospace">            res = self.queue.get(True)</font></div><div><font face="monospace, monospace">            if res is None:</font></div><div><font face="monospace, monospace">                break</font></div><div><font face="monospace, monospace">            self.process(*res)</font></div><div><font face="monospace, monospace">        print('quitting thread')</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    def doCommand(self, cmd, *args):</font></div><div><font face="monospace, monospace">        self.queue.put((cmd, args))</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    def process(self, cmd, *args):</font></div><div><font face="monospace, monospace">        getattr(self, cmd)(*args)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    def myCommand(self, *args):</font></div><div><font face="monospace, monospace">        print('doing some long process with {}'.format(*args))</font></div><div><font face="monospace, monospace">        self.working.emit(True)</font></div><div><font face="monospace, monospace">        sleep(2)</font></div><div><font face="monospace, monospace">        print('processing complete')</font></div><div><font face="monospace, monospace">        self.working.emit(False)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    def quit(self):</font></div><div><font face="monospace, monospace">        self.queue.put(None)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">class Test(QtWidgets.QWidget):</font></div><div><font face="monospace, monospace">    def __init__(self):</font></div><div><font face="monospace, monospace">        QtWidgets.QWidget.__init__(self)</font></div><div><font face="monospace, monospace">        l = QtWidgets.QGridLayout()</font></div><div><font face="monospace, monospace">        self.setLayout(l)</font></div><div><font face="monospace, monospace">        b = QtWidgets.QPushButton('cmd')</font></div><div><font face="monospace, monospace">        l.addWidget(b)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        q = QtWidgets.QPushButton('quit')</font></div><div><font face="monospace, monospace">        l.addWidget(q)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        self.worker = Worker()</font></div><div><font face="monospace, monospace">        b.clicked.connect(lambda: self.worker.doCommand('myCommand', 'Argument 1', 'Argument 2'))</font></div><div><font face="monospace, monospace">        q.clicked.connect(self.quit)</font></div><div><font face="monospace, monospace">        self.worker.working.connect(b.setDisabled)</font></div><div><font face="monospace, monospace">        self.workerThread = QtCore.QThread()</font></div><div><font face="monospace, monospace">        self.worker.moveToThread(self.workerThread)</font></div><div><font face="monospace, monospace">        self.workerThread.started.connect(self.worker.run)</font></div><div><font face="monospace, monospace">        self.workerThread.start()</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    def quit(self):</font></div><div><font face="monospace, monospace">        self.worker.quit()</font></div><div><font face="monospace, monospace">        QtWidgets.QApplication.quit()</font></div></div><div><br></div><div><br>This will show a simple window with two buttons. The latter will just quit the program and the thread with it, which is suggested in most cases (expecially when using external modules, and if that's the case add a custom signal and connect it to the quit() slot of the QThread).</div><div>The former button will call some virtually long process (taking 2 seconds in this case) but will not block the user interface; instead, it will send a "working" signal itself, disabling the button to avoid further processing (since the process is in the same thread, further clicking will "queue" the processing) until the process is actually finished.</div><div><br>Some special care is required with the signal connection: signals have to be connected *before* starting the thread, otherwise they won't be received by the QObject (since its thread is already running and waiting for the queue to be filled, thus blocking any other interaction - including signal connection).</div><div>If, for any reason, you need to connect signals afterwards, just use the timeout argument of the Queue.get() method to a reasonable amount and customize the "quit" message to put into the queue, leaving the "None" result to continue the while cycle.</div><div><br>Regards,</div><div>Maurizio</div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Il giorno dom 31 mar 2019 alle ore 18:28 <<a href="mailto:kristof.mulier@telenet.be">kristof.mulier@telenet.be</a>> ha scritto:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
Is there a way to set a priority on programmatically fired pyqt signals?<br>
I've posted a StackOverflow question about the matter:<br>
<a href="https://stackoverflow.com/questions/55442777/pyqt5-how-to-set-a-priority-to-a-pyqtsignal" rel="noreferrer" target="_blank">https://stackoverflow.com/questions/55442777/pyqt5-how-to-set-a-priority-to-a-pyqtsignal</a><br>
Please leave your reply on the StackOverflow page (or send it over mail).<br>
<br>
Thank you very much :-)<br>
Kind greetings,<br>
<br>
Kristof Mulier<br>
<br>
_______________________________________________<br>
PyQt mailing list    <a href="mailto:PyQt@riverbankcomputing.com" target="_blank">PyQt@riverbankcomputing.com</a><br>
<a href="https://www.riverbankcomputing.com/mailman/listinfo/pyqt" rel="noreferrer" target="_blank">https://www.riverbankcomputing.com/mailman/listinfo/pyqt</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">È difficile avere una convinzione precisa quando si parla delle ragioni del cuore. - "Sostiene Pereira", Antonio Tabucchi<br><a href="http://www.jidesk.net" target="_blank">http://www.jidesk.net</a></div>