crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Печать в отдельном потоке
RazrFalcon
  опции профиля:
сообщение 3.7.2013, 13:49
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Простейший пример:
void MainWindow::onPrintClicked()
{
    m_printThread = new QThread(this);
    m_print = new Print;
    // передаем указатель на m_printer
    QPrintDialog(m_print->printer(), this);
    m_print->moveToThread(m_printThread);
    m_printThread->start();
    QMetaObject::invokeMethod(m_print, "print", Qt::QueuedConnection);
}

void Print::print()
{
    QPainter painter(m_printer);
    // рисуем нашу заранее подготовленную картинку с нужным масштабом
    painter.drawImage(0, 0, m_img.scaledToWidth(500, Qt::SmoothTransformation)));
}

Проблема в следующем: при печати pdf - все работает отлично, но при печати на реальный принтер получаю варнинг
QPixmap: It is not safe to use pixmaps outside the GUI thread
Дока говорит QPixmap в потоке использовать нельзя, а можно QImage, и именно его я и использую...
В итоге из-за варнингов этих на печати у меня пустые страницы... При том что drawLine и прочие примитивы печатает нормально. Не хочет только QImage.
В чем может быть проблема?

Сообщение отредактировал RazrFalcon - 3.7.2013, 18:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.7.2013, 18:20
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Возможно сам Q-принтер (внутри использует QPixmap). Как вариант печатать только из главного потока (организовав очередь), а в эту очередь помещать QImage из разных потоков.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 3.7.2013, 18:31
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


я не спец в Qt, но у тебя объекты разные: в поток ты перенёс объект класса Print, а вызываешь метод класса PrintBook. скорее всего, часть класса PrintBook не будет адаптирована для работы в потоке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.7.2013, 18:53
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Iron Bug, опечатка, поправил :rolleyes:

Litkevich Yuriy, так в том то и беда, что в основном потоке прога фризится. Да и QPrinter в pdf то нормально пишет. А на реальный принтер уже не хочет...
Попробую QImage рендерить в потоке, может и выгорит.

Сообщение отредактировал RazrFalcon - 3.7.2013, 18:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.7.2013, 19:39
Сообщение #5


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата
Как вариант печатать только из главного потока (организовав очередь), а в эту очередь помещать QImage из разных потоков.

Все тормоза именно в painter.drawImage() и его то я не могу вынести в поток...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.7.2013, 20:51
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(RazrFalcon @ 3.7.2013, 20:53) *
Попробую QImage рендерить в потоке, может и выгорит.
а я понял, что ты его уже и используешь:
Цитата(RazrFalcon @ 3.7.2013, 15:49) *
а можно QImage, и именно его я и использую...


К стати, по моим субъективным наблюдениям Qt::SmoothTransformation заставляет заметно потеть функцию масштабирования.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.7.2013, 21:22
Сообщение #7


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Да, почти в два раза дольше, но картинка лучше немного.
В общем идея вынести печать полностью в поток, а не частично. Пока никак...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.7.2013, 22:15
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


В общем, проверь у себя такую вещь: использование одного экземпляра QPrinter в разных потоках - источник проблем.

Пробуй создать экземпляр принтера в неком потоке и всю печатную обработку суй в этот же поток.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 4.7.2013, 12:51
Сообщение #9


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


В общем да, по сути в этом и должна была быть проблема.
Вот тут дали развернутый ответ: http://qt-project.org/forums/viewthread/29549/
Но проблема осталась, даже когда абсолютно все создано в потоке...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 5.7.2013, 8:54
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


как вариант - сериализировать QImage в файл, затем запустить вспомогательный процесс, который этот файл распечатает. Грабли, конечно. Вообще, эта заморочка Qt с зависимостью GUI от потока напрягает...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 6.10.2024, 19:19