Russian Qt Forum

Qt => Вопросы новичков => Тема начата: AK от Январь 20, 2021, 08:27



Название: Генерация собственного сообщения QEvent
Отправлено: AK от Январь 20, 2021, 08:27
Использую несколько потоков тяжелых вычислений, по окончанию расчетов в потоке посылаю главному потоку сообщение (пример подсмотрел, кажется осознал и доработал):
Код:
const QEvent::Type THREAD_FINISHED_EVENT = static_cast<QEvent::Type>(QEvent::User + 111);
class TFinishedEvent : public QEvent
{
public:
    TFinishedEvent(const int thread_id) :
                   QEvent ( THREAD_FINISHED_EVENT ),
                   id ( thread_id ) {}
    void post(QObject *receiver)
    {
        QApplication::postEvent( receiver, new TFinishedEvent( id ) );
    }
    int  getID() const { return id; }
private:
    int       id;
};
Вроде  работает.  Но меня смущает
Код:
new TFinishedEvent( id ) 
. Куда девается динамически создаваемый экземпляр класса? Остается в куче и создает утечки? Если да, то как сделать грамотно?


Название: Re: Генерация собственного сообщения QEvent
Отправлено: Old от Январь 20, 2021, 08:41
Второе же предложение в документации:
The event must be allocated on the heap since the post event queue will take ownership of the event and delete it once it has been posted. It is not safe to access the event after it has been posted.


Название: Re: Генерация собственного сообщения QEvent
Отправлено: AK от Январь 20, 2021, 08:59
А как же тогда забрать идентификатор потока?
Работал такой код:
Код:
void MainWindow::customEvent(QEvent *event)
{
    if ( event -> type() == THREAD_FINISHED_EVENT )
    {
        ui -> teInfo -> append("Message received, ID="
        + QString::number( static_cast<TFinishedEvent *>(event) -> ID() ) );
    }
}
Получается, что если экземпляр будет автоматически удален, то я потеряю доступ к полю id? Или удален экземпляр будет удален только после выхода из customEvent()?
 


Название: Re: Генерация собственного сообщения QEvent
Отправлено: AK от Январь 20, 2021, 09:10
Второе же предложение в документации:
The event must be allocated on the heap since the post event queue will take ownership of the event and delete it once it has been posted. It is not safe to access the event after it has been posted.
"posted", я так понимаю, это отправка в очередь событий. Фактически написано, что событие будет удалено после отправления в очередь. Следует читать, что удалено будет после очередного завершения customEvent()?


Название: Re: Генерация собственного сообщения QEvent
Отправлено: Old от Январь 20, 2021, 09:30
Google translate:
Событие должно быть размещено в куче, поскольку очередь событий публикации станет владельцем события и удалит его после того, как оно будет опубликовано. Доступ к событию после его публикации небезопасен.

Конечно имеется ввиду, когда оно будет доставлено.


Название: Re: Генерация собственного сообщения QEvent
Отправлено: AK от Январь 20, 2021, 09:43
Да, спасибо большое, но читалось, согласитесь, неочевидно. Для новичка во всяком случае.


Название: Re: Генерация собственного сообщения QEvent
Отправлено: Igors от Январь 20, 2021, 17:02
Использую несколько потоков тяжелых вычислений, по окончанию расчетов в потоке посылаю главному потоку сообщение (пример подсмотрел, кажется осознал и доработал):
Возможно для той же цели лучше подойдет слот/сигнал, механизм событий будет задействован автоматычно при посылке из одной нитки в другую если коннект был AutoConnection (дефаулт)


Название: Re: Генерация собственного сообщения QEvent
Отправлено: Авварон от Январь 21, 2021, 03:02
Хороший пример когда "вумные" указатели бы пригодились