[Ответить в тред] Ответить в тред

09/07/16 - Новое API для капчи - внимание разработчикам приложений
03/04/16 - Набор в модераторы 03.04 по 8.04
26/03/16 - Конкурс: Помоги гомункулу обрести семью!



[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 8 | 1 | 5
Назад Вниз Каталог Обновить

Привет Двач, помогите советом и наставлением. Livin la vida Loca 05/07/16 Втр 12:43:43  788430  
14677118235960.png (289Кб, 562x550)
Привет Двач, помогите советом и наставлением. Ибо я нуб и учусь чему-то только когда сталкиваюсь с этим. В идеале - прямым ответом на вопрос. Суть в чем, пытаюсь написать игрульку на С++ при помощи SFML , и для создания потоков юзаю include thread. И вот у меня два вопроса.
Первый.
thread thr.(вся фигня, т.е. имя функции и пар-ры)

и далече thr.join() или thr.detach(),
— вот чем они толком отличаются? Я читал что джойн блокирует выполнение остальных потоков пока этот не сделается. Но какой тогда в этом смысл? Мне ж нужно что б параллельно шло. detach - на одном форуме писали что это типа делает поток фоновым, то есть я так понял работает параллельно другим, но на другом писали что он удаляет поток вообще. Мне нужно что бы они все работали параллельно. Че использовать?
Второй.
thread очень удобная штука, и я могу передать туда любые параметры. Вот только когда я передаю RenderWindow window (то есть указатель на него) , я никак не могу нарисовать что то из этого потока. Вообще. При запуске консоль дико спамит Failed to enable window's context. Все что не пробиваю по этой теме - все на ангельском. Не понятно. На русском посоветовали прописать в конце window.setActive(false), то есть типа отключать окно при передаче, но во1ых это не помогло, во2ых я не вижу в этом смысла, т к даже если я никуда не передаю окно, а сразу создаю его в другом потоке - рисовать оттуда ничего не выходит. Как быть в общем ?
Аноним 05/07/16 Втр 13:21:56  788447
>>788430 (OP)
http://en.cppreference.com/w/cpp/thread/thread/detach и http://en.cppreference.com/w/cpp/thread/thread/join уже прочитал?
Аноним 05/07/16 Втр 13:30:29  788452
>>788447
Я не знаю инглиш. Т.е. знаю, но на уровне дноря. А как показывает практика, автоперевод - говно , и им лучше не руководствоваться. >>788447
>
Аноним 05/07/16 Втр 14:03:51  788471
>>788430 (OP)
>Вот только когда я передаю RenderWindow window (то есть указатель на него) , я никак не могу нарисовать что то из этого потока. Вообще. При запуске консоль дико спамит Failed to enable window's context.
Наверно дело не в самих тредах. Огл может рисовать только в главном цикле главного окна(для него создается контекст отрисовки).
Аноним 05/07/16 Втр 14:20:40  788484
>>788430 (OP)
join подключается к потоку и дожидается его выполнения (выполнения тела потока, например, если у тебя создан:
> std::thread([](){ doSmth(); });
то пока doSmth() не выполнится, код после thread.join() выполняться не будет, если выполнение doSmth завершено еще до join'a, то после выполнения thread.join(); будет выполняться следующий код, очевидно. Если во время выполнения потока будет сгенерировано исключение, вот тут я забыл, лел, но для std::async оно пробрасывается в участок, в котором вызвается get() фьючерса.
Если вызван thread.detach(), то ты отсоединяешь владение потоком, то есть ты больше не можешь к нему подключиться join()-ом, потому что это вызовет ексепшен (ненавижу их).

> thread очень удобная штука, и я могу передать туда любые параметры. Вот только когда я передаю RenderWindow window (то есть указатель на него) , я никак не могу нарисовать что то из этого потока. Вообще. При запуске консоль дико спамит Failed to enable window's context. Все что не пробиваю по этой теме - все на ангельском. Не понятно. На русском посоветовали прописать в конце window.setActive(false), то есть типа отключать окно при передаче, но во1ых это не помогло, во2ых я не вижу в этом смысла, т к даже если я никуда не передаю окно, а сразу создаю его в другом потоке - рисовать оттуда ничего не выходит. Как быть в общем ?
Если ты рисуешь OpenGL залупу, то тебе нужно переключить контекст GL в текущем треде (потому что для потоков по-умолчанию контекст не задан, и рендеришь ты в нихуя, поэтому у тебя ничего не рисуется).
Аноним 05/07/16 Втр 14:23:02  788485
>>788430 (OP)
Пока ты не делаешь join, потоки работают параллельно. join нужен, чтобы дождаться завершения потока (если у тебя там конечная операция, а не обработка io, например). detach, наоборот, отбрасывает контроль над потоком, после него join сделать уже невозможно.
Аноним 05/07/16 Втр 14:35:08  788498
>>788484
Щикаарно, есть рекомендации как составить запрос в поисковике что б быстрее найти как это делается? )
Аноним 05/07/16 Втр 14:44:11  788504
>>788498
Хуй знает, с сфмл не работал ни разу, но вот это, может быть, попрет (не уверен, что для многопоточки это прокатит)
http://www.sfml-dev.org/tutorials/2.0/window-opengl.php#managing-multiple-opengl-windows
Аноним 05/07/16 Втр 19:47:36  788794
>>788452
> Я не знаю инглиш.
Для C++ это пререквизит, лалка.

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 8 | 1 | 5
Назад Вверх Каталог Обновить

Топ тредов