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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Segfault при отрисовке QImage в потоке...  (Прочитано 13161 раз)
Hordi
Гость
« : Декабрь 25, 2008, 16:06 »

Столкнулся с неприятной вещью... Создаю в потоке QImage и когда на нем рисую текст через drawText - 1 к 10 программа падает... Замена отрисовки текста на drawImage такого эффекта не дает, к аналогичной проблеме приводит вызов из потока функций из QFontMetrics... Я уже весь свой код 10 раз пересмотрел и начал сомневаться, что проблема у меня...

Код вроде этого:

Код:

void threadFunc()
{
    QImage img(100,100,..._RGB16);
   
    QPainter pnt(&img);
    pnt.drawText(QPoint(...),"xxx");
}

« Последнее редактирование: Декабрь 25, 2008, 20:09 от Константин » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Декабрь 25, 2008, 16:13 »

Поидее все должно быть ОК. А какая версия Qt?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Hordi
Гость
« Ответ #2 : Декабрь 25, 2008, 16:51 »

4.4.3
Записан
BRE
Гость
« Ответ #3 : Декабрь 25, 2008, 17:42 »

Проверил у себя. Qt-4.4.3.
Программа не падает, но перестает отрисовываться GUI и Х в консоль сыпет:
Цитировать
X Error: RenderBadGlyphSet (invalid GlyphSet parameter) 167
  Extension:    149 (RENDER)
  Minor opcode: 25 (RenderCompositeGlyphs32)
  Resource id:  0x0
Если с текстом не работать, то все Ок.
Похоже на баг Qt.  Непонимающий
« Последнее редактирование: Декабрь 25, 2008, 17:44 от BRE » Записан
BRE
Гость
« Ответ #4 : Декабрь 25, 2008, 17:56 »

Вот тестовый проект.
Попробуйте у себя.
Записан
BRE
Гость
« Ответ #5 : Декабрь 25, 2008, 18:27 »

Если в контексте нити создать QFont-объект и установить его в качестве текущего в QPainter, то вроде заработало.
Код
C++ (Qt)
void DrawThread::run()
{
QImage img( 300, 300, QImage::Format_RGB16 );
 
QFont font( "Arial", 12 );
 
QPainter p( &img );
p.setFont( font );
p.drawText( QPoint( 10, 10 ), "Test text" );
p.drawLine( QPoint( 20, 20 ), QPoint( 280, 280 ) );
}
 
« Последнее редактирование: Декабрь 25, 2008, 18:29 от BRE » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Декабрь 25, 2008, 18:37 »

Воспроизвел краш и в линуксе и в винде. Предложеный BRE вариант работает нормально.

Qt 4.4.3, Windows XP, openSuse 11
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
BRE
Гость
« Ответ #7 : Декабрь 25, 2008, 18:42 »

Ну все таки это костыль, IMHO.
Записан
ритт
Гость
« Ответ #8 : Декабрь 25, 2008, 18:44 »

да, похоже на баг Qt.
необходимо отрапортовать Троллям...только у них сейчас каникулы до января...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Декабрь 25, 2008, 18:45 »

Ну все таки это костыль, IMHO.


+1

Нужно писать баг репорт
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #10 : Декабрь 25, 2008, 18:47 »

Ну все таки это костыль, IMHO.

но это правильный костыль Улыбающийся
только я вот не помню для какой версии была заявлена поддержка рисования в негуёвом (о как) потоке...ткните в доки кто-нибудь? у меня полнотекстовый поиск по ассистанту (люцена) почему-то не фунциклирует
Записан
BRE
Гость
« Ответ #11 : Декабрь 25, 2008, 18:52 »

Раздел Paint System, там
Цитировать
Image
The QImage class provides a hardware-independent image representation which is designed and optimized for I/O, and for direct pixel access and manipulation. QImage supports several image formats including monochrome, 8-bit, 32-bit and alpha-blended images.
One advantage of using QImage as a paint device is that it is possible to guarantee the pixel exactness of any drawing operation in a platform-independent way. Another benefit is that the painting can be performed in another thread than the current GUI thread.
Записан
Hordi
Гость
« Ответ #12 : Декабрь 25, 2008, 19:41 »

Вобщем повторяется если одновременно че-нить рисовать на widgete и в потоке че-нить делать... В аттаче похожий проектик, только я не QImage рисую, а просто из потока вызываю QFontMetrics.height()... Падает уверенно.

Я ща запулю Троллтечу письмо - все-таки коммерческая поддержка должна работать...
Записан
BRE
Гость
« Ответ #13 : Декабрь 25, 2008, 20:04 »

Вобщем повторяется если одновременно че-нить рисовать на widgete и в потоке че-нить делать... В аттаче похожий проектик, только я не QImage рисую, а просто из потока вызываю QFontMetrics.height()... Падает уверенно.

Я ща запулю Троллтечу письмо - все-таки коммерческая поддержка должна работать...
У меня не падает, в консоль ничего не выдает.  Непонимающий
Что бросилось в глаза, у тебя _fm создается в контексте GUI, а height() ты дергаешь уже из контекста нити.
Записан
Hordi
Гость
« Ответ #14 : Декабрь 26, 2008, 11:58 »

Цитировать
У меня не падает, в консоль ничего не выдает. 
Что бросилось в глаза, у тебя _fm создается в контексте GUI, а height() ты дергаешь уже из контекста нити.
Да, но ведь в доке написано, что все функции QFontMetrics reentrant! Я пробовал из потока обращаться к QApplication::font() - также падает. Обойти конечно можно, хотя бы способом, указанным выше (QFont в потоке), но QFontMetrics содержит массу кода по поддержке многопоточности - он переинициализироваться должен если его вызывают не из потока создания, поэтому пусть костыли делают в Троллтече... Ну или умное объяснение такого поведения хотя бы наваяют Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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