January 25, 2012

dvez43 dvez43
Ant Farmer
218 posts

Events during form close…

 

Quick question.

Do signals on the main application finish before the application ~mainForm() happens when exiting the application?

I know you usually want to wait for other threads to finish before prematurely destroying the active thread, but if you have a signal from another thread hitting the main application, is there a way to wait for those signals to finish before the main thread closes?

I am getting an odd exception on my form close…that’s the only reason why I am asking.

Cheers!

7 replies

January 26, 2012

Volker Volker
Robot Herder
5428 posts

Signals from other threads are not delivered directly, but via Qt’s event system. So it may be that the object has been destroyed already. Instead of calling deleted directly on the object (delete xyz) you could schedule the destruction using Qt’s event system by calling xyz->deleteLater(). It’s just a guess, I did not test it.

January 26, 2012

Gerolf Gerolf
Area 51 Engineer
3210 posts
Volker wrote:
Instead of calling deleted directly on the object (delete xyz) you could schedule the destruction using Qt’s event system by calling xyz->deleteLater(). It’s just a guess, I did not test it.

This might solve the problem, but it is not guaranteed. If an object from another thread issues an async signal after deleteLater call, it will be put to the event queue after the delete call. So same issue.

 Signature 

Nokia Certified Qt Specialist.
Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

January 26, 2012

GentooXativa GentooXativa
Lab Rat
126 posts

You can try to catch the closing action checking

  1. QCoreApplication::closingDown ()

If the application is closing, the value returns true.

Another way is capturing the QEvent::close() on your QCoreApplication.

 Signature 

Jose Vicente Giner Sanchez - Senior Mobile Developer

www.gigigo.com

C/ Dr. Zamenhof 36bis, 1ºA 28027 Madrid
T: +34 917431436

January 26, 2012

Volker Volker
Robot Herder
5428 posts

At application closeDown the form is most probably already destroyed.

Using deleteLater() makes sure that the object is only deleted at the next run of the event loop – this usually happens when the slots directly connected to a signal have finished their work (unless you call processEvents manually). Every pending event directed to the object to be deleted is nuked in that case.

January 26, 2012

GentooXativa GentooXativa
Lab Rat
126 posts

That’s true @Volker. Thanks for your tip ^^

By the way, i remember a signal named onClose but i cant find at documentation. But im sure i used it some time ago.

 Signature 

Jose Vicente Giner Sanchez - Senior Mobile Developer

www.gigigo.com

C/ Dr. Zamenhof 36bis, 1ºA 28027 Madrid
T: +34 917431436

January 26, 2012

GentooXativa GentooXativa
Lab Rat
126 posts

Nevermind, was a custom signal i made capturing the QEvent::close. :P

 Signature 

Jose Vicente Giner Sanchez - Senior Mobile Developer

www.gigigo.com

C/ Dr. Zamenhof 36bis, 1ºA 28027 Madrid
T: +34 917431436

January 26, 2012

dvez43 dvez43
Ant Farmer
218 posts

That is a great point Volker. Thank you all for your input. I will be testing this today.

 
  ‹‹ SSPI support      QMYSQL3 Unable to reset statement ››

You must log in to post a reply. Not a member yet? Register here!