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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [4.2.3] Непонятный баг  (Прочитано 13486 раз)
Разуев Максим
Гость
« : Август 09, 2007, 13:54 »

У меня есть основанная на QEventLoop функция Sleep. Она через таймер, крутит QEventLoop указанное количество времени.
Реализованна она внутри одного класса.
В другом классе(наследник QGraphicsView) у меня реализован вывод моего собственного обьекта (наследника QGraphicsItem).
Так вот я в функции класса QGraphicsView вызываю функцию hide моего обьекта. Потом вызываю Sleep(msec). После возврата из Sleep переменная содержавшая мой обьект почемуто получает левое значение.
Так же задержку я пытался сделать через QTimeLine та же проблема.(QTimeLine была внутри класса наследника  QGraphicsView)
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Август 09, 2007, 14:02 »

Интересно взлянуть на код. Запость его
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Разуев Максим
Гость
« Ответ #2 : Август 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;
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Август 09, 2007, 15:04 »

какая переменная получает левое значение?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Разуев Максим
Гость
« Ответ #4 : Август 09, 2007, 15:24 »

Код:

GraphicsHotSpotItem *CurrHotSpot;

class GraphicsHotSpotItem : public QAbstractGraphicsShapeItem
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Август 09, 2007, 16:27 »

странно. А если закоментить sleep? Проблема изчезает? А если попробывать для теста заюзать вот такой sleep:

Код:

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


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

Но, имхо, в данной ситуации sleep непричём.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
vaprele07
Гость
« Ответ #6 : Август 10, 2007, 02:09 »

попробуй после mainWin->MainTextEdit->Sleep(1000) сделать:
QApplication::processEvents();
можно еще в иксах QApplication::syncX();
Записан
Разуев Максим
Гость
« Ответ #7 : Август 10, 2007, 06:56 »

QApplication::processEvents(); не помогает.
Я попробовал реализовать sleep внутри класса QGraphicsView. Но проблема не изменилась. А проблема именно в Sleep. Переменная теряется именно после ее вызова. Может кто подскажет тогда как организовать задержку на заданное время.
Кстати: система Windows, компилятор Ms Visual Studio 2005.

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

 Интересно сейчас выяснил, что значение теряет и переменная this. Это уж точно глюк. Как this может терять значение внутри функции класса.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Август 10, 2007, 08:56 »

попробуй просто сделать цикл с QDateTime
типа

int d = QDateTime::currentDateTime().toTime_t();
do {
//...
} while (QDateTime::currentDateTime().toTime_t() - d < 1000);
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Tonal
Гость
« Ответ #9 : Август 10, 2007, 10:16 »

Судя по всему, твой объект умирает не дождавшись окончания таймаута.
Поставь точку останова на деструктор или на изменения значения CurrHotSpot и посмотри кто гадит. ;-)
Записан
Разуев Максим
Гость
« Ответ #10 : Август 10, 2007, 11:22 »

QDateTime работает спасибо (только время там в секундах).
Но вылазит другая проблема:
Задержка мне нужна была чтобы при внешнем событии обьект в QGraphicsView помигал. Я при обработке события вывожу в QGraphicsView рисунок(QGraphicsPixmapItem), загружаю в него мои обьекты(GraphicsHotSpotItem), потом нахожу нужный мне обьект и прячу и показываю его несколько раз с задержкой(чтобы добиться мигания).
Но почемуто все эти действия с обьктом происходят до окончательного вывода рисунка и обьектов на экран. Поясняю - Сцена уже создана, QGraphicsPixmapItem добавлена в сцену, так же в сцену добавлены GraphicsHotSpotItem. То есть сцена должна быть видна, но почемуто до показа сцены происходи обработка цикла задержки.

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

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


Проверил, действительно происходит вызов деструктора обьекта (НО ПОЧЕМУ!!!). Деструктор пустой, гадить нечему.
Непонятно почему вызывается деструктор ведь обьект не уничтожается.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Август 10, 2007, 11:46 »

В 4.2.3 в QEventLoop есть бага. Если создать дополнительный QEventLoop и выйти из него, то при определённых условиях, приложение завершает работу (фактически выходим и главного цикла обработки сообщений). Возмодно это он и есть. Можешь заюзать sleep предложеный мной выше или такая запись глаз режет? Подмигивающий

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

 Можешь подебажить в QEventLoop при его завершении: как главного так и вспомогатеьно циклов
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Разуев Максим
Гость
« Ответ #12 : Август 10, 2007, 11:53 »

Пробовал я виндовый Sleep вылазит та же проблема что я указал выше (сначала обрабатываются sleepы потом показывается сцена).
А по циклу я отдебаггил, то что почемуто происходит отложенный вызов удаления QGraphicsPixmapItem (Перед вставкой картинки я удаляю старую указатель на которую хранится в переменной класса QGraphicsView). Но удаление почемуто происходит не сразу а после того как я обращусь к EventLoop (или вызову QApplication::processEvents). Похоже глюк.
Но тогда как мне всеже добится мигания обьекта.
Записан
vaprele07
Гость
« Ответ #13 : Август 10, 2007, 13:08 »

QObject::startTimer
QObject::timerEvent
Думаю этого хватит для помигать  :roll:
Записан
Разуев Максим
Гость
« Ответ #14 : Август 10, 2007, 13:32 »

QGraphicsItem не имеет таймера. Они не наследники от QObject.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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