Results 1 to 9 of 9

Thread: Issue emitting signal from background thread.

  1. #1
    Join Date
    Jul 2012
    Posts
    5
    Qt products
    Qt4
    Platforms
    Windows

    Default Issue emitting signal from background thread.

    I have a class that I move to a background thread that constantly checks a server for updated settings. If the settings were updated then I emit a signal that forces the program to restart with the new settings. The problem I'm having is when I try to emit the signal it throws a segfault.

    Where I connect this signal to the slot I want it to call.

    Qt Code:
    1. connect(&settings_agent, SIGNAL(updatedSettingsNotification()), LCD,SLOT(restarting()));
    To copy to clipboard, switch view to plain text mode 

    This signal that I am trying to emit:

    Qt Code:
    1. void SettingsFileRetrievalAgent::handleDeletedRegistration()
    2. {
    3. emit updatedSettingsNotification(); //if delete registration, this can cause a crash (let it run maybe 15 seconds after startup).
    4. }
    To copy to clipboard, switch view to plain text mode 





    This is the result from GDB Debugger:

    Qt Code:
    1. Program received signal SIGSEGV, Segmentation fault.
    2. [Switching to Thread 30704.0x7c2c]
    3. 0x6a2b0e31 in QObjectPrivate::isSignalConnected (this=0x0, signal_index=3)
    4. at ../../include/QtCore/private/../../../../../../../ndk_buildrepos/qt-desktop/src/corelib/kernel/qobject_p.h:219
    5. 219 ../../include/QtCore/private/../../../../../../../ndk_buildrepos/qt-desktop/src/corelib/kernel/qobject_p.h: No
    6. uch file or directory.
    7. in ../../include/QtCore/private/../../../../../../../ndk_buildrepos/qt-desktop/src/corelib/kernel/qobject_p.h
    To copy to clipboard, switch view to plain text mode 


    The result when I do a bt:


    Qt Code:
    1. #0 0x6a2b0e31 in QObjectPrivate::isSignalConnected (this=0x0, signal_index=3)
    2. at ../../include/QtCore/private/../../../../../../../ndk_buildrepos/qt-desktop/src/cor
    3. #1 0x6a2164d8 in QMetaObject::activate (sender=0x28d2cc, m=0x4a80cc, local_signal_index=1
    4. at c:\ndk_buildrepos\qt-desktop\src\corelib\kernel\qobject.cpp:3201
    5. #2 0x0041dced in ?? ()
    6. #3 0x0040fd66 in ?? ()
    7. #4 0x0041dc73 in ?? ()
    8. #5 0x6a205ff8 in QMetaObject::metacall (object=0x28d2cc, cl=QMetaObject::InvokeMetaMethod
    9. at c:\ndk_buildrepos\qt-desktop\src\corelib\kernel\qmetaobject.cpp:237
    10. #6 0x6a210c9d in QMetaCallEvent::placeMetaCall (this=0xe0a67b8, object=0x28d2cc)
    11. at c:\ndk_buildrepos\qt-desktop\src\corelib\kernel\qobject.cpp:535
    12. #7 0x6a212ba8 in QObject::event (this=0x28d2cc, e=0xe0a67b8)
    13. at c:\ndk_buildrepos\qt-desktop\src\corelib\kernel\qobject.cpp:1217
    14. #8 0x0111bd88 in QApplicationPrivate::notify_helper (this=0xa0d6bb8, receiver=0x28d2cc, e
    15. at c:\ndk_buildrepos\qt-desktop\src\gui\kernel\qapplication.cpp:4462
    16. #9 0x011196da in QApplication::notify (this=0x28fe4c, receiver=0x28d2cc, e=0xe0a67b8)
    17. at c:\ndk_buildrepos\qt-desktop\src\gui\kernel\qapplication.cpp:3862
    18. #10 0x6a201540 in QCoreApplication::notifyInternal (this=0x28fe4c, receiver=0x28d2cc, even
    19. at c:\ndk_buildrepos\qt-desktop\src\corelib\kernel\qcoreapplication.cpp:731
    20. #11 0x6a268258 in QCoreApplication::sendEvent (receiver=0x28d2cc, event=0xe0a67b8)
    21. at c:/ndk_buildrepos/qt-desktop/src/corelib/kernel//qcoreapplication.h:215
    22. #12 0x6a2025eb in QCoreApplicationPrivate::sendPostedEvents (receiver=0x0, event_type=0, d
    23. at c:\ndk_buildrepos\qt-desktop\src\corelib\kernel\qcoreapplication.cpp:1372
    24. #13 0x6a2248e7 in qt_internal_proc (hwnd=0x440ba8, message=1025, wp=0, lp=0)
    25. at c:\ndk_buildrepos\qt-desktop\src\corelib\kernel\qeventdispatcher_win.cpp:497
    26. #14 0x75ed62fa in USER32!OffsetRect () from C:\Windows\syswow64\user32.dll
    27. #15 0x00440ba8 in ?? ()
    28. #16 0x75ed6d3a in USER32!IsWindow () from C:\Windows\syswow64\user32.dll
    29. #17 0x6a22467e in qt_fast_timer_proc (timerId=0, user=4459432)
    30. at c:\ndk_buildrepos\qt-desktop\src\corelib\kernel\qeventdispatcher_win.cpp:429
    31. #18 0x75ed77c4 in USER32!AnyPopup () from C:\Windows\syswow64\user32.dll
    32. #19 0x00000000 in ?? ()
    To copy to clipboard, switch view to plain text mode 


    Qt Code:
    1. this=0x0
    To copy to clipboard, switch view to plain text mode 
    I'm assuming this is the problem. I don't know if it's related to how the QThreads and Signals work, I just can't seem to figure out what the problem is. Any hints or ideas as to why this is happening would be great.
    Last edited by Chris@Link; 2nd July 2012 at 22:06. Reason: Added some more information to the post.

  2. #2
    Join Date
    Jan 2006
    Location
    Munich, Germany
    Posts
    4,714
    Thanks
    21
    Thanked 418 Times in 411 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows

    Default Re: Issue emitting signal from background thread.

    show your code.
    It seems 'LCD' is null.
    ==========================signature=============== ==================
    S.O.L.I.D principles (use them!):
    https://en.wikipedia.org/wiki/SOLID_...iented_design)

    Do you write clean code? - if you are TDD'ing then maybe, if not, your not writing clean code.

  3. #3
    Join Date
    Jul 2012
    Posts
    5
    Qt products
    Qt4
    Platforms
    Windows

    Default Re: Issue emitting signal from background thread.

    Start a new thread and run the worker_thread()


    Qt Code:
    1. QThread *settingsFileUpdaterThread = new QThread;
    2. settings_agent.moveToThread(settingsFileUpdaterThread);
    3. settingsFileUpdaterThread->start();
    4. QMetaObject::invokeMethod(&settings_agent, "worker_thread", Qt::QueuedConnection);
    To copy to clipboard, switch view to plain text mode 


    Qt Code:
    1. void SettingsFileRetrievalAgent::worker_thread()
    2. {
    3. while(1)
    4. status = updateSettingsIfPossible();
    5.  
    6. if (status == RETURN_SUCCESS_CACHE_UPDATED)
    7. {
    8. emit updatedSettingsNotification(); //segfault
    9. }
    10. for( int count = 0; count < 2; ++count )
    11. sleep( 1 );
    12. }
    13. }
    To copy to clipboard, switch view to plain text mode 

    I have other threads that are just about identical and they don't seem to have a problem when emitting a signal.

  4. #4
    Join Date
    Jan 2006
    Location
    Munich, Germany
    Posts
    4,714
    Thanks
    21
    Thanked 418 Times in 411 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows

    Default Re: Issue emitting signal from background thread.

    Right.
    Where did you initialize 'LCD'?
    ==========================signature=============== ==================
    S.O.L.I.D principles (use them!):
    https://en.wikipedia.org/wiki/SOLID_...iented_design)

    Do you write clean code? - if you are TDD'ing then maybe, if not, your not writing clean code.

  5. #5
    Join Date
    Jul 2012
    Posts
    5
    Qt products
    Qt4
    Platforms
    Windows

    Default Re: Issue emitting signal from background thread.

    Qt Code:
    1. MainWindow::MainWindow(QWidget *parent) :
    2. QMainWindow(parent),
    3. ui(new Ui::MainWindow)
    4. {
    5. ui->setupUi(this);
    6. QMetaObject::invokeMethod(this, "startup" , Qt::QueuedConnection);
    7. }
    To copy to clipboard, switch view to plain text mode 


    Qt Code:
    1. void MainWindow::startup()
    2. // Get pointer to layout manager for main window
    3. QLayout* layout = this->layout();
    4. // Add LCD screen to the main window layout at specified position
    5. LCD = new(IPR5000_LCD)(this);
    6. LCD->setGeometry(430,50,320,240);
    7. LCD->setParent(this);
    8. layout->addWidget(LCD);
    9. }
    To copy to clipboard, switch view to plain text mode 

  6. #6
    Join Date
    Jan 2006
    Location
    Munich, Germany
    Posts
    4,714
    Thanks
    21
    Thanked 418 Times in 411 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows

    Default Re: Issue emitting signal from background thread.

    does this initialization happen before you start settingsFileUpdaterThread ?
    If so, what exactly "restaring()" does?
    Sound like a place where all kind of mischief can happen, if "restarting()" is re-spawning threads or similar thread related stuff - if this is the case - care has to be taken that things are all correctly terminated and initialized.
    If you comment out all the content of "restarting()" does it still crash (the same way)?
    ==========================signature=============== ==================
    S.O.L.I.D principles (use them!):
    https://en.wikipedia.org/wiki/SOLID_...iented_design)

    Do you write clean code? - if you are TDD'ing then maybe, if not, your not writing clean code.

  7. #7
    Join Date
    Jul 2012
    Posts
    5
    Qt products
    Qt4
    Platforms
    Windows

    Default Re: Issue emitting signal from background thread.

    Qt Code:
    1. void MainWindow::startup()
    2. // Get pointer to layout manager for main window
    3. QLayout* layout = this->layout();
    4. // Add LCD screen to the main window layout at specified position
    5. LCD = new(IPR5000_LCD)(this);
    6. LCD->setGeometry(430,50,320,240);
    7. LCD->setParent(this);
    8. layout->addWidget(LCD);
    9.  
    10. KeyManagementAgent key_management_agent;
    11. SettingsFileRetrievalAgent settings_agent( key_management_agent );
    12. connect(&settings_agent, SIGNAL(updateSettingsNotification()), LCD, SLOT(restarting()));
    13. // move it to its own thread and do stuff with it.
    14. QThread *settingsFileUpdaterThread = new QThread;
    15. settings_agent.moveToThread(settingsFileUpdaterThread);
    16. settingsFileUpdaterThread->start();
    17. QMetaObject::invokeMethod(&settings_agent, "worker_thread", Qt::QueuedConnection);
    18.  
    19. }
    To copy to clipboard, switch view to plain text mode 

    Qt Code:
    1. void IPR5000_LCD::restarting()
    2. {
    3. ui->stackedWidget->setCurrentIndex(2);
    4. }
    To copy to clipboard, switch view to plain text mode 


    Like I said previously I do this sort of thing other places without problems so I don't see any reason there would be a problem with the 'LCD', it just happens to be this thread that is giving me issues.

    Commenting out the code in the restarting() method still results in a segfault. I tried printing a simple debug message and it still crashes. I don't think it's a problem with the LCD class. The LCD slot is never called because the signal is never emitted, that's how I know it cant be the LCD.

    Edit: It will loop about 5-8 times before it throws a segfault.

    I really appreciate the help.
    Last edited by Chris@Link; 3rd July 2012 at 16:59.

  8. #8
    Join Date
    Jan 2006
    Location
    Munich, Germany
    Posts
    4,714
    Thanks
    21
    Thanked 418 Times in 411 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows

    Default Re: Issue emitting signal from background thread.

    1. Is 'key_management_agent' a parent for 'settings_agent' or just a parameter?
    2. settings_agent is a stack variable, which dies at the end of the constructor. I would expect moveToThread() to have a problem with that - try allocating it on the heap.
    This would also explain this==NULL.
    Like I said previously I do this sort of thing other places without problems so I don't see any reason there would be a problem with the 'LCD', it just happens to be this thread that is giving me issues.
    1.LCD was a likely candidate - since I don't know your code I wanted to rule it out.
    2.I fail to see the relevance of the claim that something worked somewhere else since obviously its not *exactly* the same, and secondly, obviously it doesn't work here - so it helps little that it does somewhere else.
    Specially when threads are in question - since alone different hardware (same software) may produce different results, or bring bugs to the surface on one system that are not see on another.
    For your own good - stop thinking "this has to work" if it doesn't - rather "I must be doing something wrong if it doesn't work".
    By the way, the code as you posted it, really requires no threads.
    ==========================signature=============== ==================
    S.O.L.I.D principles (use them!):
    https://en.wikipedia.org/wiki/SOLID_...iented_design)

    Do you write clean code? - if you are TDD'ing then maybe, if not, your not writing clean code.

  9. #9
    Join Date
    Jul 2012
    Posts
    5
    Qt products
    Qt4
    Platforms
    Windows

    Default Re: Issue emitting signal from background thread.

    Quote Originally Posted by high_flyer View Post
    1. Is 'key_management_agent' a parent for 'settings_agent' or just a parameter?
    2. settings_agent is a stack variable, which dies at the end of the constructor. I would expect moveToThread() to have a problem with that - try allocating it on the heap.
    This would also explain this==NULL.
    Upon further investigation the settings_agent and the key_management_agent was being destroyed after we finished the startup function. I don't know how I managed to overlook that but I did.

    Quote Originally Posted by high_flyer View Post
    2.I fail to see the relevance of the claim that something worked somewhere else since obviously its not *exactly* the same, and secondly, obviously it doesn't work here - so it helps little that it does somewhere else.
    Specially when threads are in question - since alone different hardware (same software) may produce different results, or bring bugs to the surface on one system that are not see on another.
    For your own good - stop thinking "this has to work" if it doesn't - rather "I must be doing something wrong if it doesn't work".
    By the way, the code as you posted it, really requires no threads.
    I understand, I was extremely frustrated and I overlooked the fact that the stack variable was being destroyed.


    Thanks for the help.

Similar Threads

  1. Emitting signals in other thread
    By mvbhavsar in forum Newbie
    Replies: 9
    Last Post: 8th June 2011, 08:17
  2. Replies: 5
    Last Post: 22nd February 2011, 21:21
  3. Replies: 9
    Last Post: 28th November 2009, 20:31
  4. Emitting signal from DLL to EXE
    By Miihkali in forum Qt Programming
    Replies: 6
    Last Post: 27th March 2009, 08:32
  5. Emitting signal causes CRASH
    By navi1084 in forum Qt Programming
    Replies: 7
    Last Post: 12th March 2009, 16:17

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Qt is a trademark of The Qt Company.