Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

creating task from the MainUi (PyQT5 class) init works fine in v0.24.0 but not with v0.24.2 and above #116

Open
stephanerey opened this issue Mar 22, 2024 · 2 comments

Comments

@stephanerey
Copy link

The code below where I'm creating an async task "counter" from the MainUI class init function was working fine with version 0.24.0 but is not working anymore from 0.24.2. The task is never created while the loop is running. Creating the same task in the same loop from the main() function works fine with 0.24.0 up to lastest 0.27.1 (commented lines in the main() )
Is there something wrong in my task creation code ?

import functools
import sys, traceback
import asyncio, qasync
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMainWindow, QLabel, QVBoxLayout, QWidget


class MainUi(QMainWindow):
    def __init__(self):
        super().__init__()
        self.count = 0

        # Pyqt GUI init
        layout = QVBoxLayout()
        self.label = QLabel()
        layout.addWidget(self.label)
        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

        # create thread
        # Only work with QASYNC 0.24.0 but not with newer versions
        self.loop = asyncio.get_event_loop()
        self.loop.create_task(self.counter())

    async def counter(self):
        while True:
            self.count += 1
            self.label.setText(str(self.count))
            await asyncio.sleep(1)

async def main():
    app = QtWidgets.QApplication(sys.argv)
    app.setQuitOnLastWindowClosed(True)

    loop = qasync.QEventLoop(app)
    asyncio.set_event_loop(loop)

    ui = MainUi()
    ui.show()

    # The line below works with both QASYNC 0.24.0 and above
    # loop.create_task(ui.counter())

    with loop:
        # Run the event loop until the UI is closed
        await asyncio.gather(loop.create_task(loop.run_forever()),
                             loop.run_in_executor(None, functools.partial(ui.show)))
    # Cleanup and close the application
    loop.close()
    app.exec_()


if __name__ == '__main__':
    try:
        asyncio.run(main())
    except Exception as e:
        print("An error occurred:", e)
        traceback.print_exc()
        sys.exit(1)
@stephanerey stephanerey changed the title creating task difference from 0.24.0 and 0.24.2 creating task from the MainUi (PyQT5 class) init works fine in v0.24.0 but not with v0.24.2 and above Mar 22, 2024
@kormax
Copy link

kormax commented Mar 24, 2024

When you're calling asyncio.run, it creates and runs default asyncio loop on the main thread.

You're later attempting to replace already running loop with a newly instantiated QAsync loop, inside of the initial loop, without stopping and closing it first.

Weird that this code worked in the first place, because it shouldn't have.

Normally, you'd need to instantiate qasync loop outside of asynchronous context, set it as the main loop, and then start the asynchronous task (with loop running via run_forever or run_until_complete).

@stephanerey
Copy link
Author

stephanerey commented Mar 25, 2024

thanks for your reply. I'm probably confusing and I'm sorry. I thought the asyncio.get_event_loop() was used in order to get the current running loop so I do not understand why I'm instantiating a new loop in my code.
Next if one can't instantiate a new thread other than in the main thread how to you do to start a new thread that is triggered by an event from anywhere in the code other than the main thread ? Does it mean all the threads should be created and doing nothing until something unlock the code inside ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants