Discussion about threads, moveToThread etc.



  • Hi JKSH...I am waiting for your reply.
    If you have any doubtds so please askSo I can clear you.


  • Moderators

    1. It sounds like you want to send requests when a user clicks on something in the GUI? If so, this thread needs to receive signals from your GUI so it needs an event loop. Use moveToThread() to put a worker QObject in the thread to handle the signals.

    2. How do you receive data? The answer will determine if you need an event loop or not. (Classes like QTcpSocket and QSerialPort need an event loop to work. But if you use low-level code to poll your hardware, then you don't need an event loop)



  • Hi KJSH.....
    thnx for your reply.
    from serial line I have to recive data.
    -Actualy I read data continuously from serial line and then put into system queue.
    -and my next thread available to read system queue continuously so whatever data receive other thread can use it to update on GUI.

    And all this I implemented by subclass QThread and override run() and all working well.


  • Moderators

    If it is already working well, then don't change it :)

    Usually, people discuss about "how should I implement ________?" before starting the project. If you need threads in the future, just remember: there are 2 ways to use QThread, and the "best" method depends on what you want to do.

    • If you need to receive signals/events in the other thread, then don't subclass QThread.
    • If you don't need receive signals/events in the other thread, then subclass QThread.


  • yes I agree with you but What I implemented is wrong then according to your two ways:

    1. If you need to receive signals/events in the other thread, then don’t subclass QThread.
    2. If you don’t need receive signals/events in the other thread, then subclass QThread.

    Because I emits signals from my Thread which receiving data from Serial lines and those signals handled by other(GUI) thread.
    and I subclass QThread in my implementation and now I feel its wrong implementation according to you.


  • Moderators

    [quote author="Ak@sh" date="1375331989"]

    1. If you need to receive signals/events in the other thread, then don’t subclass QThread.
    2. If you don’t need receive signals/events in the other thread, then subclass QThread.

    Because I emits signals from my Thread which receiving data from Serial lines and those signals handled by other(GUI) thread.
    and I subclass QThread in my implementation and now I feel its wrong implementation according to you.[/quote]Don't worry, it is not wrong.

    I said, if a thread receives signals, then that thread should not use a subclassed QThread. But, if the thread only emits signals (not receive), you can subclass QThread.

    A thread needs an event loop to receive signals, but it doesn't need an event loop to emit signals.



  • Ok my one thread(A) is emits signals but other thread(B) receiving signals and handle them there.
    So ultimately other thread(B) receiving signals right?
    and I subclass QThread in that thread(B) which receiving signals which emits by first thread(A).

    Now I did wrong right?????????????



  • Yes, you did it wrong.

    Keep in mind that, QThread::run() is the entry point of the thread, which more or less like the main() is the entry point of the process.If you want some code to be run in the thread, they must be called inside the QThread:;run() function.



  • If you want to understand in which way the queued-connection works, and in which way the slots get called in the QThread::run(). You at least need to make yourself familiar with Event Loop.


  • Moderators

    [quote author="Ak@sh" date="1375335153"]Ok my one thread(A) is emits signals but other thread(B) receiving signals and handle them there.
    So ultimately other thread(B) receiving signals right?[/quote]Correct.

    [quote]and I subclass QThread in that thread(B) which receiving signals which emits by first thread(A).

    Now I did wrong right????????????? [/quote]Correct. In this scenario, (B) should not be subclassed.

    Remember: the QThread is an object that controls the thread, but the QThread object is not a thread. If you connect a signal to a QThread's slot, the slot will probably run in the "wrong" thread.



  • Hey its really great thing that only I want to asked and confirm with you.
    "If you connect a signal to a QThread’s slot, the slot will probably run in the “wrong” thread."

    can you please give me any live example or scenario from all this will more clear for me.
    Please sir reply



  • Hi, QThread is subclass of QObject. So "you connect a signal to a QThread’s slot" == "you connect a signal to a normal QObject’s slot"

    There is no other magic here.
    [quote author="Ak@sh" date="1375340827"]Hey its really great thing that only I want to asked and confirm with you.
    "If you connect a signal to a QThread’s slot, the slot will probably run in the “wrong” thread."

    can you please give me any live example or scenario from all this will more clear for me.
    Please sir reply [/quote]



  • can you please give me any live example or scenario from all this will more clear for me.


  • Moderators

    Remember these two things all the time:

    A QObject lives in the thread that created it

    A QObject's slots will run in the thread that it lives in

    Example of a bad class:
    @
    class BadThread : public QThread {
    Q_OBJECT

    public:
    BadThread(QObject *parent = 0);

    public slots:
    void badSlot();

    protected:
    void run();
    };
    @

    Example of bad code using the bad class:
    @
    int main(...){
    ...

    // Create 2 objects (myObject and badThread),
    // which both live in the main thread.
    MyObject *myObject = new MyObject();    
    BadThread *badThread = new BadThread();
    
    // Make a signal-slot connection
    QObject::connect(myObject, SIGNAL(mySignal()),
            badThread, SLOT(badSlot()));
    
    // Start the new thread.
    // BadThread::run() runs in the new thread.
    badThread->start();
    
    // Emit a signal to invoke the slot.
    // BadThread::badSlot() runs in the main thread.
    emit mySignal();    
    
    ...
    

    }
    @

    In the above example:

    badThread was created by the main thread, so it lives in the main thread

    badThread lives in the main thread, so its slots run in the main thread.



  • Ok.........Finaly I think I got it.
    All summary of our Discussion :
    tow ways to use QThread -

    1. create an object of QThread class and call function - moveToThread().
      2.subclass QThread class and override function - run()

    when you use moveToThread()? : -
    if you want to run any SLOT as thread of any class then you should use moveToThread().

    when you use run()? : -
    if you know u want to run only(or very specificaly) run() of any class and not other SLOTS of same class which having that run() then you should use subclass QThread and override run().

    If you think still I am going wrong in understanding of QThread then please correct me sir...

    Thnax for your reply and guidance...



  • Hi JKSH........

    r u thr?


  • Moderators

    Hi Ak@sh, yes your summary is good :)



  • Hi, I have write a blog about this, may be you have interest to it.

    http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/



  • Thanx JKSH.>!!!



  • hi JKSH.

    I found one error:-

    undefined symbol _zn9qlistdata11detach_growepii qt

    I am trying to run my application which compiled on different machine(but OS and Qt version is same).

    Please give me any solution


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.