Название: [4.2.3] Непонятный баг Отправлено: Разуев Максим от Август 09, 2007, 13:54 У меня есть основанная на QEventLoop функция Sleep. Она через таймер, крутит QEventLoop указанное количество времени.
Реализованна она внутри одного класса. В другом классе(наследник QGraphicsView) у меня реализован вывод моего собственного обьекта (наследника QGraphicsItem). Так вот я в функции класса QGraphicsView вызываю функцию hide моего обьекта. Потом вызываю Sleep(msec). После возврата из Sleep переменная содержавшая мой обьект почемуто получает левое значение. Так же задержку я пытался сделать через QTimeLine та же проблема.(QTimeLine была внутри класса наследника QGraphicsView) Название: [4.2.3] Непонятный баг Отправлено: pastor от Август 09, 2007, 14:02 Интересно взлянуть на код. Запость его
Название: [4.2.3] Непонятный баг Отправлено: Разуев Максим от Август 09, 2007, 15:01 Реализация функции:
Код:
Вызов функции: Код:
добавлено спустя: QEventLoop el; Название: [4.2.3] Непонятный баг Отправлено: pastor от Август 09, 2007, 15:04 какая переменная получает левое значение?
Название: [4.2.3] Непонятный баг Отправлено: Разуев Максим от Август 09, 2007, 15:24 Код:
Название: [4.2.3] Непонятный баг Отправлено: pastor от Август 09, 2007, 16:27 странно. А если закоментить sleep? Проблема изчезает? А если попробывать для теста заюзать вот такой sleep:
Код:
Исчезнет проблема? Но, имхо, в данной ситуации sleep непричём. Название: [4.2.3] Непонятный баг Отправлено: vaprele07 от Август 10, 2007, 02:09 попробуй после mainWin->MainTextEdit->Sleep(1000) сделать:
QApplication::processEvents(); можно еще в иксах QApplication::syncX(); Название: [4.2.3] Непонятный баг Отправлено: Разуев Максим от Август 10, 2007, 06:56 QApplication::processEvents(); не помогает.
Я попробовал реализовать sleep внутри класса QGraphicsView. Но проблема не изменилась. А проблема именно в Sleep. Переменная теряется именно после ее вызова. Может кто подскажет тогда как организовать задержку на заданное время. Кстати: система Windows, компилятор Ms Visual Studio 2005. добавлено спустя 8 минут: Интересно сейчас выяснил, что значение теряет и переменная this. Это уж точно глюк. Как this может терять значение внутри функции класса. Название: [4.2.3] Непонятный баг Отправлено: Racheengel от Август 10, 2007, 08:56 попробуй просто сделать цикл с QDateTime
типа int d = QDateTime::currentDateTime().toTime_t(); do { //... } while (QDateTime::currentDateTime().toTime_t() - d < 1000); Название: [4.2.3] Непонятный баг Отправлено: Tonal от Август 10, 2007, 10:16 Судя по всему, твой объект умирает не дождавшись окончания таймаута.
Поставь точку останова на деструктор или на изменения значения CurrHotSpot и посмотри кто гадит. ;-) Название: [4.2.3] Непонятный баг Отправлено: Разуев Максим от Август 10, 2007, 11:22 QDateTime работает спасибо (только время там в секундах).
Но вылазит другая проблема: Задержка мне нужна была чтобы при внешнем событии обьект в QGraphicsView помигал. Я при обработке события вывожу в QGraphicsView рисунок(QGraphicsPixmapItem), загружаю в него мои обьекты(GraphicsHotSpotItem), потом нахожу нужный мне обьект и прячу и показываю его несколько раз с задержкой(чтобы добиться мигания). Но почемуто все эти действия с обьктом происходят до окончательного вывода рисунка и обьектов на экран. Поясняю - Сцена уже создана, QGraphicsPixmapItem добавлена в сцену, так же в сцену добавлены GraphicsHotSpotItem. То есть сцена должна быть видна, но почемуто до показа сцены происходи обработка цикла задержки. добавлено спустя 6 минут: Цитата: "Tonal" Судя по всему, твой объект умирает не дождавшись окончания таймаута. Поставь точку останова на деструктор или на изменения значения CurrHotSpot и посмотри кто гадит. ;-) Проверил, действительно происходит вызов деструктора обьекта (НО ПОЧЕМУ!!!). Деструктор пустой, гадить нечему. Непонятно почему вызывается деструктор ведь обьект не уничтожается. Название: [4.2.3] Непонятный баг Отправлено: pastor от Август 10, 2007, 11:46 В 4.2.3 в QEventLoop есть бага. Если создать дополнительный QEventLoop и выйти из него, то при определённых условиях, приложение завершает работу (фактически выходим и главного цикла обработки сообщений). Возмодно это он и есть. Можешь заюзать sleep предложеный мной выше или такая запись глаз режет? ;)
добавлено спустя 1 минуту: Можешь подебажить в QEventLoop при его завершении: как главного так и вспомогатеьно циклов Название: [4.2.3] Непонятный баг Отправлено: Разуев Максим от Август 10, 2007, 11:53 Пробовал я виндовый Sleep вылазит та же проблема что я указал выше (сначала обрабатываются sleepы потом показывается сцена).
А по циклу я отдебаггил, то что почемуто происходит отложенный вызов удаления QGraphicsPixmapItem (Перед вставкой картинки я удаляю старую указатель на которую хранится в переменной класса QGraphicsView). Но удаление почемуто происходит не сразу а после того как я обращусь к EventLoop (или вызову QApplication::processEvents). Похоже глюк. Но тогда как мне всеже добится мигания обьекта. Название: [4.2.3] Непонятный баг Отправлено: vaprele07 от Август 10, 2007, 13:08 QObject::startTimer
QObject::timerEvent Думаю этого хватит для помигать :roll: Название: [4.2.3] Непонятный баг Отправлено: Разуев Максим от Август 10, 2007, 13:32 QGraphicsItem не имеет таймера. Они не наследники от QObject.
Название: [4.2.3] Непонятный баг Отправлено: vaprele07 от Август 10, 2007, 14:34 Я думал ты догадаешься и сделаешь его наследником :mrgreen:, это не баг это многозадачность.
Название: [4.2.3] Непонятный баг Отправлено: Разуев Максим от Август 10, 2007, 14:52 Тут вылазит другая проблема, наследником можно сделать, но вот при вставке макроса Q_OBJECT комилятор ругается. То есть нельза заюзать систему сигналов/слотов. А без нее и таймер бессмыленен.
Но я наконец окончательно разобрался с QTimeLine и всетаки сделал мигание. Хотя баг никуда не делся. Название: [4.2.3] Непонятный баг Отправлено: pastor от Август 10, 2007, 15:30 Цитата: "Разуев Максим" Тут вылазит другая проблема, наследником можно сделать, но вот при вставке макроса Q_OBJECT комилятор ругается. То есть нельза заюзать систему сигналов/слотов. А без нее и таймер бессмыленен. Т.е. ты имеешь ввиду, если наследоваться вот так: Код: class MyItem : public QGraphicsItem, public QObject То будет ругаться компилятор? А на что он ругаетья? Название: [4.2.3] Непонятный баг Отправлено: Tonal от Август 10, 2007, 15:43 Если вызывается деструктор - значит объект кто-то уничтожает - это же элементарно. ;-)
Поставь там точку останова и посмотри стек вызовов. Похоже какой-то сигнал проскакивает... Название: [4.2.3] Непонятный баг Отправлено: Разуев Максим от Август 10, 2007, 15:44 Код:
Название: [4.2.3] Непонятный баг Отправлено: pastor от Август 10, 2007, 15:54 2 Разуев Максим: Вы унаследовали свой итем от QObject или нет?
Код:
Название: [4.2.3] Непонятный баг Отправлено: Разуев Максим от Август 10, 2007, 16:27 Да
добавлено спустя 4 минуты: Цитата: "Tonal" Если вызывается деструктор - значит объект кто-то уничтожает - это же элементарно. ;-) Поставь там точку останова и посмотри стек вызовов. Похоже какой-то сигнал проскакивает... Я уже писал что отследил уничтожение. Удаляется родительский обьект, но удаляется он раньше, потом создается новый и к нему добавляются мои итемы. Но по трассингу удаление вызывается(точнее деструкторы) уже после создания нового обьекта. Указатель на обьект у меня хранится в переменной класса QGraphicsView(точнее наследного от него). |