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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: не работает в дебаге 4.7.3 (QtConcurrent ?)  (Прочитано 3146 раз)
wester
Гость
« : Август 13, 2012, 15:39 »

Доброго времени суток.
Есть код в widget.cpp
Код
C++ (Qt)
void Widget::updateAll()
{
   QList<QString> k = printerMap.keys();
   QFuture<QString> future =QtConcurrent::mapped(k,&Widget::updateState);
 
   watcher.setFuture(future); // QFutureWatcher<QString> watcher;
}
...
QString Widget::updateState(const QString &name) // static QString updateState(const QString& s);
{
   Detector detector(name,printerMap[name]);
   QString printerState = name;
   if(detector.getStatePrinter())
   {
       printerState+= " is ready";
   }
   else{
       printerState+= " is busy";
   }
   return printerState;
}

и фрагмент кода в detectop.cpp
Код
C++ (Qt)
QImage imageSource("ready.gif","GIF");
   qDebug()<<imageSource.size();
 
   QImage *imageEdited=new QImage(imageSource.width(),imageSource.height(),QImage::Format_RGB32);
   qDebug()<<imageEdited->size();
   imageEdited->fill(QColor(Qt::white).rgb());
   QPainter painter(imageEdited); // sigsegv in debug
   painter.drawImage(0, 0, imageSource);
    QImage imageJpg = *imageEdited;
 
 
 //  qDebug()<<"pixel - "<<QColor::fromRgb(pixel).black();
 
   bool res =var5550test1(&imageJpg);
 
   delete imageEdited;
   return res;
}
и проблема в том, что код который работает в релизной версии, в отладке возбуждает исключение sigsegv   в QPainter.drawImage();

Но! если метод вызывается напрямую без QtConcurrent то все работает.
Код
C++ (Qt)
Dvoid Widget::on_pushButton_clicked()
{
   Detector d("5550",printerMap["5550"]);
   d.check5550Availability();
   return;
}

вот сижу и думаю, кто виноват и как исправлять

Qt 4.7.3 Win Xp SP3
Записан
Nimbus
Гость
« Ответ #1 : Август 14, 2012, 13:17 »

У меня одного вызывает подозрения этот фрагмент кода?
Код
C++ (Qt)
QFuture<QString> future =QtConcurrent::mapped(k,&Widget::updateState);
Ты передаёшь указатель на метод экземпляра (как я понял, это метод экземпляра, а не статический метод, т. к обращается к полю this->printerMap), а про указатель на сам экземпляр, ты видимо забыл? Как оно вообще работает?
Может, лучше так?
Код
C++ (Qt)
QFuture<QString> future =QtConcurrent::mapped(k,this->updateState);

З. Ы. Извините, давно на С++ не кодил
Записан
wester
Гость
« Ответ #2 : Август 14, 2012, 14:11 »

Не думаю.  Widget::updateState у меня статический (забыл упомянуть).Если использовать указатель на this, то точно ничего хорошего не будет, так как нужен только статический член класса.
 В релизе оно работает прекрасно  Смеющийся, мне просто не ясна природа такого поведения.

upd:
По ходу дела возникла еще одна странность.
могу написать и будет успешно работать
Код
C++ (Qt)
watcher.setFuture(QtConcurrent::mapped(printerMap.uniqueKeys(),&Widget::updateState));
где printerMap объявлен как static QMap<QString,QString> printerMap;
но, если я хочу сделать, что - то типа такого
Код
C++ (Qt)
void Widget::getPrinterInfo(const QString &printerName)
{
QList<QString> l;
l.push_back(printerName);
watcher.setFuture(QtConcurrent::mapped(l,&Widget::updateState));

то программа падает во время выполнения updateState.
« Последнее редактирование: Август 14, 2012, 15:29 от wester » Записан
Nimbus
Гость
« Ответ #3 : Август 14, 2012, 18:35 »

Просто странно как компилятор вот от этого отличает.

Хммм... Видимо, дело в стековой переменной  Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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