Russian Qt Forum
Май 03, 2024, 10:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Генерация собственного сообщения QEvent  (Прочитано 2106 раз)
AK
Новичок

Offline Offline

Сообщений: 14


Просмотр профиля
« : Январь 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 ) 
. Куда девается динамически создаваемый экземпляр класса? Остается в куче и создает утечки? Если да, то как сделать грамотно?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Январь 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.
Записан
AK
Новичок

Offline Offline

Сообщений: 14


Просмотр профиля
« Ответ #2 : Январь 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()?
 
Записан
AK
Новичок

Offline Offline

Сообщений: 14


Просмотр профиля
« Ответ #3 : Январь 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()?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #4 : Январь 20, 2021, 09:30 »

Google translate:
Событие должно быть размещено в куче, поскольку очередь событий публикации станет владельцем события и удалит его после того, как оно будет опубликовано. Доступ к событию после его публикации небезопасен.

Конечно имеется ввиду, когда оно будет доставлено.
« Последнее редактирование: Январь 20, 2021, 09:31 от Old » Записан
AK
Новичок

Offline Offline

Сообщений: 14


Просмотр профиля
« Ответ #5 : Январь 20, 2021, 09:43 »

Да, спасибо большое, но читалось, согласитесь, неочевидно. Для новичка во всяком случае.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Январь 20, 2021, 17:02 »

Использую несколько потоков тяжелых вычислений, по окончанию расчетов в потоке посылаю главному потоку сообщение (пример подсмотрел, кажется осознал и доработал):
Возможно для той же цели лучше подойдет слот/сигнал, механизм событий будет задействован автоматычно при посылке из одной нитки в другую если коннект был AutoConnection (дефаулт)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #7 : Январь 21, 2021, 03:02 »

Хороший пример когда "вумные" указатели бы пригодились
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.079 секунд. Запросов: 22.