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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Qt / Вопросы новичков / Re: Генерация собственного сообщения QEvent : Январь 20, 2021, 09:43
Да, спасибо большое, но читалось, согласитесь, неочевидно. Для новичка во всяком случае.
2  Qt / Вопросы новичков / Re: Генерация собственного сообщения QEvent : Январь 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()?
3  Qt / Вопросы новичков / Re: Генерация собственного сообщения QEvent : Январь 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()?
 
4  Qt / Вопросы новичков / Генерация собственного сообщения QEvent : Январь 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 ) 
. Куда девается динамически создаваемый экземпляр класса? Остается в куче и создает утечки? Если да, то как сделать грамотно?
5  Qt / Вопросы новичков / Re: Как вызываются деструкторы : Январь 20, 2021, 07:32
Не вижу примера прямого вызова деструктора. А какой был порыв любознательности, желания все изучить! И сразу потух, и куда все делось?  Улыбающийся
Igors, спасибо за заботу! Удрученный собственным невежеством и обрадованный небольшим его уменьшением удалился изучать матчасть Улыбающийся Вон народ книжек посоветовал, изучаю. Пока на вашу задачку не знаю ответа
6  Qt / Вопросы новичков / Re: Как вызываются деструкторы : Январь 20, 2021, 07:28
Спасибо большое, буду читать Эккеля!  Пока подобрал себе Дейтел "Как программировать на C++", изучаю! 
7  Qt / Вопросы новичков / Re: Как вызываются деструкторы : Декабрь 15, 2020, 15:14
То есть все статические объекты: объявленные явно как static, либо объявленные вне функций будут уничтожены с вызовом деструктора при завершении программы? В ссылке про вызов деструктора не написано явно, но видимо, так.
8  Qt / Вопросы новичков / Re: Как вызываются деструкторы : Декабрь 15, 2020, 14:42
Видимо, если объявить объект, как глобальную переменную, а не на стеке, то для него придется явно вызвать деструктор
9  Qt / Вопросы новичков / Re: Как вызываются деструкторы : Декабрь 15, 2020, 14:40
В каком-то смысле, явного деструктора требуют динамически создаваемые объекты, он при вызове delete вызывается, на сколько я понимаю. Далее надо думать..
10  Qt / Вопросы новичков / Re: Как вызываются деструкторы : Декабрь 15, 2020, 14:32
Буду думать над редким примером
11  Qt / Вопросы новичков / Re: Как вызываются деструкторы : Декабрь 15, 2020, 14:31
Igors, спасибо!! Очень полезное обсуждение. Прямо чувствую, как умнею! Улыбающийся

12  Qt / Вопросы новичков / Re: Как вызываются деструкторы : Декабрь 15, 2020, 13:26
Ааа, Пантер, спасибо большое!
13  Qt / Вопросы новичков / Re: Как вызываются деструкторы : Декабрь 15, 2020, 12:48
 Я вот и пытаюсь учить, книжки читаю, но вопросы остаются.
1. Спасибо по п. 1 вроде понял: при удалении родителя все дочерние объекты будут также удалены.
2. Частично понятно из п.1. Про "статически" снялся вопрос. Но в основном непонятно. Я представляю себе так: я создал объект QString s="Abc" Где-то в памяти, наверное, в куче, размещено "Abc". Перед закрытием программы следует очистить память. Для этого нужно явно или неявно вызвать деструктор. QString не является наследником другого объекта QObject (п.1), поэтому следует вызвать деструктор явно. Правильно ли я рассуждаю?
3. Из того, что читал следует, что переменные могут размещаться в отдельном сегменте данных (глобальные переменные),  время жизни = времени жизни программы, в стеке (локальные переменные функций и методов) время жизни = времени выполнения функции/метода, в куче там время жизни - пока явно не удалю. Если объект объявлен в методе, он - локальная переменная, все, что его касается, хранится в стеке, правда, он может выделить память в куче. Опять же нужно явно вызывать деструктор получается?
4.  Ну да, я не понимаю ни основы C++ ни специфику Qt, пытаюсь разобраться,  в книжках ответы не нашел, потому и спрашиваю Улыбающийся По моей логике (порочной судя по брезгливому комментарию) надо явно вызвать деструктор MainWindow, в котором освободить всю выделенную под массивы в куче память и вызвать деструкторы всех созданных объектов. Но такой деструктор в изученных мной примерах никто не делает. Очевидно, я где-то не прав, но не понимаю где.
14  Qt / Вопросы новичков / Как вызываются деструкторы : Декабрь 15, 2020, 11:22
Уважаемые специалисты, я, увы, новичок в C++ и Qt вопрос, как следует вызывать деструкторы
1. Правильно ли я понимаю, что динамически-созданные объекты классов, наследующих QObject, всегда уничтожаются Qt автоматически? Т.е. явно вызывать "delete S;" после  "QString S; S = new QString("Abc");..." не нужно?
2. Если я создаю статически, скажем "QString S = "Abc";"  как поле класса, то должен в деструкторе класса обязательно написать "S.~QString();" ?
3. Если я объявил "QString S = "Abc";", как локальную переменную метода, то деструктор можно не вызывать, так как объект S будет размещен в стеке и память выделенная S будет освобождена после завершения выполнения метода?
4. Во всех примерах создания оконных приложений:
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow winMain;
    winMain.show();
    return app.exec();
}

Объект MainWindow создается статически, получается, его деструктор не будет вызван никогда?
Тогда если полями MainWindow у меня являются динамические массивы, то единственная возможность их удались перед завершением работы приложения - написать слот для сигнала  aboutToQuit() QApplication?


Страниц: [1]

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