Russian Qt Forum

Qt => Общие вопросы => Тема начата: Разуев Максим от Август 09, 2007, 13:54



Название: [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
Реализация функции:
Код:

//Функция останова на нужное время
void TextEdit::Sleep(int msec)
{
 QTimer::singleShot(msec, this, SLOT(StopTime()));
 el.exec();
}

//Рабочая ф-я окончания останова
void TextEdit::StopTime(void)
{
 el.quit();
}

Вызов функции:
Код:

   CurrHotSpot->setBrush(QBrush(Qt::darkGreen));
   mainWin->MainTextEdit->Sleep(1000);
   CurrHotSpot->setBrush(QBrush(Qt::transparent));


добавлено спустя:

 QEventLoop el;


Название: [4.2.3] Непонятный баг
Отправлено: pastor от Август 09, 2007, 15:04
какая переменная получает левое значение?


Название: [4.2.3] Непонятный баг
Отправлено: Разуев Максим от Август 09, 2007, 15:24
Код:

GraphicsHotSpotItem *CurrHotSpot;

class GraphicsHotSpotItem : public QAbstractGraphicsShapeItem


Название: [4.2.3] Непонятный баг
Отправлено: pastor от Август 09, 2007, 16:27
странно. А если закоментить sleep? Проблема изчезает? А если попробывать для теста заюзать вот такой sleep:

Код:

void sleep(unsigned int umilliseconds )
{
#ifdef Q_WS_WIN
Sleep(umilliseconds);
#else
usleep( umilliseconds * 1000 );
#endif
}


Исчезнет проблема?

Но, имхо, в данной ситуации 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
{
    Q_OBJECT

public slots:
    .....

signals:
    ....
};


То будет ругаться компилятор? А на что он ругаетья?


Название: [4.2.3] Непонятный баг
Отправлено: Tonal от Август 10, 2007, 15:43
Если вызывается деструктор - значит объект кто-то уничтожает - это же элементарно. ;-)
Поставь там точку останова и посмотри стек вызовов.
Похоже какой-то сигнал проскакивает...


Название: [4.2.3] Непонятный баг
Отправлено: Разуев Максим от Август 10, 2007, 15:44
Код:

1>.\GeneratedFiles\Debug\moc_GraphicsHotSpotItem.cpp(37) : error C2039: 'staticMetaObject' : is not a member of 'QAbstractGraphicsShapeItem'
1>        f:\qt\4.2.3c\include\qtgui\../../src/gui/graphicsview/qgraphicsitem.h(306) : see declaration of 'QAbstractGraphicsShapeItem'
1>.\GeneratedFiles\Debug\moc_GraphicsHotSpotItem.cpp(53) : error C2039: 'qt_metacast' : is not a member of 'QAbstractGraphicsShapeItem'
1>        f:\qt\4.2.3c\include\qtgui\../../src/gui/graphicsview/qgraphicsitem.h(306) : see declaration of 'QAbstractGraphicsShapeItem'
1>.\GeneratedFiles\Debug\moc_GraphicsHotSpotItem.cpp(58) : error C2039: 'qt_metacall' : is not a member of 'QAbstractGraphicsShapeItem'
1>        f:\qt\4.2.3c\include\qtgui\../../src/gui/graphicsview/qgraphicsitem.h(306) : see declaration of 'QAbstractGraphicsShapeItem'


Название: [4.2.3] Непонятный баг
Отправлено: pastor от Август 10, 2007, 15:54
2 Разуев Максим: Вы унаследовали свой итем от QObject или нет?

Код:

class MyItem : public QGraphicsItem, public QObject


Название: [4.2.3] Непонятный баг
Отправлено: Разуев Максим от Август 10, 2007, 16:27
Да

добавлено спустя 4 минуты:

 
Цитата: "Tonal"
Если вызывается деструктор - значит объект кто-то уничтожает - это же элементарно. ;-)
Поставь там точку останова и посмотри стек вызовов.
Похоже какой-то сигнал проскакивает...


Я уже писал что отследил уничтожение. Удаляется родительский обьект, но удаляется он раньше, потом создается новый и к нему добавляются мои итемы. Но по трассингу удаление вызывается(точнее деструкторы) уже после создания нового обьекта.
Указатель на обьект у меня хранится в переменной класса QGraphicsView(точнее наследного от него).