Russian Qt Forum

Qt => OpenGL => Тема начата: Igors от Июнь 28, 2021, 22:06



Название: Рисование в отдельной нитке
Отправлено: Igors от Июнь 28, 2021, 22:06
Добрый день

Продолжение соседней темы. Быстренько прикрыл рисование мутексом, заработало, неужели проскочил? Конечно нет, на машине заказчика рушится, причем мерзко. Ну ладно, прильнул к источнику знаний
Цитировать
Thread Affinity

QOpenGLContext can be moved to a different thread with moveToThread(). Do not call makeCurrent() from a different thread than the one to which the QOpenGLContext object belongs. A context can only be current in one thread and against one surface at a time, and a thread only has one context current at a time.
Мда, не густо! И примерчика передрать не наблюдаю. А это витиеватое "аffinity" не помогает, но наоборот, запутывает. Как понять что нужно делать для "выноса в поток" ? Нужно ли делать moveToThread ? Четких указаний не вижу, но наверно да, надо. Понял что имеется ввиду нечто типа
Код
C++ (Qt)
QOpenGLWindow * win;
...
// some thread
win->makeCurrent();
DoDrawGL();
win->doneCurrent();  // видел упоминание что какие-то карты могут требовать
 
Ну и вроде это с успехом может юзаться как из главной так и из другой, ясно под защитой  мутекса (не 2 рисования вместе).

Ну хорошо, пусть я чего-то рисую, напр в др нитке, главный цикл событий обрабатывается,  вызывается paintGL в главной нитке, а до его вызова Qt сам сделает makeCгrrent - все, приплыли. Или я что-то не так понял?

Какие есть соображения?

Спасибо


Название: Re: Рисование в отдельной нитке
Отправлено: Igors от Июль 19, 2021, 06:45
Увы. "ни асилил". Да, рисование в рабочей нитке возможно, надо в ней установить контекст созданный в ней же, и рисовать. Если "не дышать" (остановить главную), то да, так работает. Но смысл именно освободить главную для UI/cобытий, и тут затык. Во-первых имею довольно много данных хранимых на видео (что удобно, слил в буфер и пользуйся), и как их (операции с ними) прикрывать - хз. Ну ладно, позатыкал очевидное, и на моей машине вроде заработало. Но на др крашит бурным потоком. Причем в самых неожиданных местах, напр главная падает в событийном цикле.

Возможно (ну это я так думаю), "обычные" окна/контролы тоже юзают OpenGL (а значит переключают контекст), тогда конечно хана. Эх, поговорить бы со знающим человеком, а тут дальше обсасывания функторов дело не идет  :'(


Название: Re: Рисование в отдельной нитке
Отправлено: kambala от Июль 19, 2021, 10:45
задавание вопроса на международной площадке с гораздо бо́льшим количеством пользователей (stackoverflow, Qt forum) повышает вероятность ответа


Название: Re: Рисование в отдельной нитке
Отправлено: Igors от Июль 19, 2021, 12:13
задавание вопроса на международной площадке с гораздо бо́льшим количеством пользователей (stackoverflow, Qt forum) повышает вероятность ответа
Там еще хуже  :'(


Название: Re: Рисование в отдельной нитке
Отправлено: Racheengel от Июль 20, 2021, 00:35
>> Но на др крашит бурным потоком. Причем в самых неожиданных местах, напр главная падает в событийном цикле.

Я бы память проверил. Какой-нибудь gflags там или valgrind, если линукс. А то очень похожие симптомы, что "где-то что-то куда-то вылазит" :)


Название: Re: Рисование в отдельной нитке
Отправлено: Igors от Июль 21, 2021, 07:55
Я бы память проверил. Какой-нибудь gflags там или valgrind, если линукс. А то очень похожие симптомы, что "где-то что-то куда-то вылазит" :)
Чем универсальнее лекарство - тем реже оно помогает.