Joey Carson
Joey Carson

Reputation: 3113

If Qt signals aren't handled because the receiving object's thread has ended, will the arguments be deleted?

Consider that object A is bound to thread T1 and a signal sig1 with an argument of QList < QVariantMap > is fired from thread T2.

The signal is queued on A's event loop, but before handling, A's thread (T1) is quit. The QList< QVariantMap > argument of sig1 is obviously allocated on the stack, I'm guessing that it should clean up itself.

But when? Perhaps when the QThread object itself is destroyed? Does anyone have specific knowledge in this area? In my system, this thread will not simply run once and end at shutdown. It may potentially be started, run for hours, and then quit and be started again later on.

Upvotes: 3

Views: 95

Answers (1)

UmNyobe
UmNyobe

Reputation: 22890

The argument will not be deleted if the thread has been terminated in a correct way like

QThread t;
t.exit();
t.wait();

Now you assert that

The QList< QVariantMap > argument of sig1 is obviously allocated on the stack

It is not that obvious. Because the receiving thread need to use the data in a deferred execution, emit(myVariantList) will eventually lead to a copy of myVariantList. You don't know where the copy is going to be allocated.

Now to allow posting events with eventual data , ie the classic

Mywidget m;
m.show(); <-- this post at least one event

app.exec();

Those posted events need to be saved just in case of an eventual execution of the event loop. I believe that if the object holding the event loop is not destroyed or the user doesn't explicitly ask for events to be removed, they stay for the lifetime of the QObject.

Upvotes: 1

Related Questions