У меня есть приложение QT C ++, в котором запущено несколько потоков, и потоки используют механизм QCoreApplication :: postEvent для передачи информации друг другу. В документации QCoreApplication :: postEvent прямо указано, что событие должно быть выделено в куче, и что небезопасно получить доступ к событию после его публикации.
http://doc.qt.io/qt-5/qcoreapplication.html#postEvent
Когда один поток в моем приложении получает событие (через QObject :: event), которое было отправлено ему другим потоком, он часто «перенаправляет» событие в другой поток через метод postEvent. Это безопасно? Должен ли я вместо этого создать совершенно новое мероприятие, которое является копией оригинала? Мое приложение вообще не рухнуло … но это не значит, что риска нет. Когда событие QT считается «опубликованным»?
bool MyQObjectDerivedClass::event(QEvent* evnt)
{
// When is QEvent considered posted?
if(evnt->type() == MY_EVENT_TYPE)
{
// Forward the event..
// Is this safe? Or should I create a copy of the event?
QCoreApplication::postEvent(myOtherQObjectClassPtr,evnt);
return true;
}
else
{
return QObject::event(evnt);
}
}
Когда вы публикуете событие, в отличие от использования sendEvent
владение указателем события передается в цикл событий объекта-получателя.
Он удалит событие после того, как доставил его объекту, т.е. после того, как объект event()
метод вернулся.
Поэтому, если вам нужно передать информацию асинхронно, вам нужно будет скопировать ее, прежде чем вернуться из event()
реализация
Других решений пока нет …