LINUX.ORG.RU

Открыть много окон SDL2/nuklear в параллельных потоках одного процесса

 , , , ,


0

2

Использую SDL2 и nuklear+ для графики. При попытке открыть два окна одновременно программа падает. Есть ли способы заставить много SDL-окон работать одновременно в разных потоках одного процесса?

Сначала открывается поток отрисовки виджета, выводящий "...". Через 5 секунд выскакивает второе графическое окошко с диалогом в главном потоке - и все, крышка:

./nuklear_cross/nuklear.h:18531: int nk_begin_titled(struct nk_context *, const char *, const char *, struct nk_rect, nk_flags): Assertion `ctx->style.font && ctx->style.font->width && "if this triggers you forgot to add a font"' failed.

Исходники в Метапрог онлайн: «разработка графического интерфейса на нуклеар+», версия 14, функция «2 параллельных окна».

Выглядит так (красным обведен блок, на котором все валится): https://i.postimg.cc/9fwcDqss/2.png

Сишная трансляция: https://pastebin.com/UybkZj8a

Во-первых про потоки написано в доках,

во-вторых, неужели ты правда думаешь, что в твоей мазне кто-то будет разбираться? Давай минимальный пример на си, а не нагенеренное говно, тогда шансы есть.

anonymous ()

А на кой ляд ты постоянно в свои опусы подключаешь кучу говна в виде заголовочных файлов и потом все это добро не используешь? Зачем тебе тот же libsodium?

anonymous ()
Ответ на: комментарий от anonymous
if(((!(!(metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537_4155438664714432513_2201504391722864641_8079043276346138625_6678815680128088065__function_return_5349986287080564737)))!=(metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537_4155438664714432513_2201504391722864641_8079043276346138625__structure_operation_return_1277187742555297793_1))&&(!(!(metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537_4155438664714432513_2201504391722864641_8079043276346138625_6678815680128088065__function_return_5349986287080564737))))

до чего умилительная срань *___*, нужно больше отрицания и скобочек чтобы как в lisp!

anonymous ()
Ответ на: комментарий от anonymous

goto metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537_4155438664714432513_2201504391722864641__switch_7874948738130192385_end;
metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537_4155438664714432513_2201504391722864641__switch_7874948738130192385_end:;
metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537_4155438664714432513_loop_1849891326043017217_register_0 = metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537_4155438664714432513_2201504391722864641__connection_760790117;


Лапшекод: Начало (на самом деле нет, давно лапшекод)

anonymous ()
Ответ на: комментарий от anonymous
        goto metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537_3786217904497745921__switch_7874948738130192385_end; // Мама, я хочу вниз 
    metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537_3786217904497745921__switch_7874948738130192385_end:;
        metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537__connection_1738165403 = metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537_3786217904497745921__connection_760790117;
        break;

Изумительный образчик использования goto, жаль бессмысленный и беспощадный.

anonymous ()

Данная тема превосходно показывает главную, я считаю, проблему метапрог-прототипа, которая имеет все шансы перейти и в метапрог-релизный — проблема коммуникаций с внешним миром.

С одной стороны, имеем отсылку на метапрог-онлайн, который ещё надо запустить.

С другой — нечитаемую сгенерённую портянку на Си.

Ни то, ни другое анализу программ на метапроге никак не способствует. Метапрог — вещь в себе, не поддающаяся анализу внешними инструментами.

А вот так презираемый ТСом человекочитаемый текст позволил бы увидеть программу, не имея IDE (достаточно обычного редактора), позволил бы написать статический анализатор и ещё дохрена всего.

hobbit ★★★★★ ()

Ты крайне нелогичный дружок, в системе версирования своего «проекта» ты применяешь сквозную индикацию, и доказывал всем, что это крайне удобно, но при этом для названия переменных ты используешь нечто нечитаемое вместо удобной для тебя же сквозной индикации, и тут бы это было действительно удобнее чем эти рулоны символов.

anonymous ()
Ответ на: комментарий от Siborgium

мало того что это бессмысленно, это еще и вредно, но светило графического программирования еще не осознал проблемы ненужности переключения контекста между такими графическими потоками и пагубность этого действа, на такого рода отрисовке. Ну ничего, ничего… Сейчас еще немного пострадает и вернется к своей любимой теме, suvt next generation.

anonymous ()
Ответ на: комментарий от hobbit

это говно вполне читаемо, более того наш любимый графпрогнач озаботился о том, чтобы все эти переменные можно было наколеночным влобным способом перегнать в приятные имена и получить вполне читаемый исходник (на самом деле конечно же нет, никакой заботы тут не было, это вышло случайно, просто уж очень хотелось придать хоть как-то этому позору метауникальность, поэтому каждая переменная в этом уродстве начинается с префикса metaprog_).

anonymous ()
Ответ на: комментарий от Siborgium

Каждое имя переменной указывает на конкретное место на схемах и подсхемах (подфункциях) где она объявлена. Очень помогает дебажить транслятор.

metaprog ()
Последнее исправление: metaprog (всего исправлений: 1)
Ответ на: комментарий от metaprog

и чтобы такого не было, нужно внутреннее представление и дерево разбора, а не лепить эти портянки, для конечного результата кодогенерации эта информация избыточна и не несет никакого смысла.

anonymous ()
Ответ на: комментарий от anonymous

нужно внутреннее представление и дерево разбора

О чем это ты?

для конечного результата кодогенерации эта информация избыточна и не несет никакого смысла

Все лишнее компилятор оптимизирует, разве нет? Особенно с -O3.

metaprog ()
Ответ на: комментарий от anonymous

а если же ты используешь в целях разбора и отладки текстовое представление диаграммы в виде кода на С, то это вообще какой-то лютый абзац, хотя бы из соображений скорости доступа к такому виду хранения представления.

anonymous ()
Ответ на: комментарий от metaprog

О чем это ты?

Да все о том же, твои портянки в именах не нужны на этапе на котором ты получаешь текстовое представление диаграммы. Ни компилятору С, ни тому кто этот код решил почитать глазами.

Все лишнее компилятор оптимизирует, разве нет? Особенно с -O3.

Надеюсь ты понял, что ты ничего не понял с первого раза.

anonymous ()
Ответ на: комментарий от anonymous

твой подход это типичный эрзац манглинга в с++, только в отличии от с++ в твоем случае он вообще бессмысленный, ну кроме того, что ты этот псевдоманглинг используешь как отладочную информацию для ручной отладки.

В общем-то ты мог сделать это хорошо, но сделал как всегда. Добавь хотя бы ключ сборки чтобы эти бестолковые имена не генерировались в конечный исходный код на С, тогда люди станут немного добрее.

anonymous ()
Ответ на: комментарий от anonymous

Ты это мне, а не другому анонимусу?

твой подход это типичный эрзац манглинга в с++,

Что это такое?

Добавь хотя бы ключ сборки чтобы эти бестолковые имена не генерировались в конечный исходный код на С

Можно но сложно, в общем нецелесообразно.

metaprog ()
Ответ на: комментарий от AdonisSexyBoy

про SDL это даже не вопрос. Как ведет себя SDL на потоках и как его в потоках лучше готовить (или как лучше не готовить) обсосано по 100500 раз. Это даже в доках написано. Но полтора «программиста» ниосилили доки и предметную область, куда сунули свои «умные» головы.

Так что автор (или его ручной миньон) читают доки и понимают как это работают, или идут в жопу. Очевидно же.

anonymous ()
Ответ на: комментарий от anonymous

нет же, просто демонстрация «жирноты и раздутости» текстового программирования – то ли дело схемы (в) метапрог(а|е): простые и лаконичные, ничего лишнего, идеал, воплощенное совершенство (и прочая, прочая)

anonymous ()

Открыть много окон SDL2/nuklear в параллельных потоках одного процесса

Никак. Спавни новое независимое окно с независимым nuklear. Ты пытаешься порвать на две части 1 конечный автомат.

Сишная трансляция: https://pastebin.com/UybkZj8a

Зачем тут это говно? Потрать 30 минут напиши всё руками человеческим кодом. Собери с -g3 и запусти с отладкой увидишь причину фейла. Это если лень читать nuklear. А если не лень то grep/ack nk_begin_titled и погляди явно что там.

Есть ли способы заставить много SDL-окон работать одновременно в разных потоках одного процесса?

Рисуй через GL с gl_share_context (задать в опциях SDL)

При желании можно всё, но ты делаешь как то на обум всё.

Через 5 секунд выскакивает второе графическое окошко с диалогом в главном потоке

Без блокировок? Тупо два треда одни и теже данные дрыгают у nuklear? В котором в одном треде может быть реаллок указателя а в доругом в тоже самое время аллок?

Тут переменных поведения мульён.

Пиши нормально руками реализацию нужного, а потом используя её как эталон переводи в свою финтифлюшку. Иначе так и будешь на месте топтать.

anonymous ()
Ответ на: комментарий от AdonisSexyBoy

Нет. Тред о том, как заставить людей читать эту порнографию.

Потому что если бы автору хотелось исправить свою проблему, он бы попытался воспроизвести проблему в другом, более родном для SDL2, окружении.

И прочитал документацию. Про многопоточность там сказано точно.

Спойлер: You should not expect to be able to create a window, render, or receive events on any thread other than the main one.

a1batross ★★★★★ ()
Последнее исправление: a1batross (всего исправлений: 1)
Ответ на: комментарий от a1batross

You should not expect to be able to create a window, render, or receive events on any thread other than the main one

В другом (не главном) треде создаю окошко - и работает, пока работает главный тред. Но вообще есть ли какие-то хаки чтоб сделать несколько окошек SDL2 в одном процессе?

metaprog ()