thread не возвращает данные от созданного окна…

SFML и C++ Уроки \ Разработка игр Форумы SFML System, Window и другие вопросы thread не возвращает данные от созданного окна…

В этой теме 8 ответов, 2 участника, последнее обновление  mifon4ik 7 года/лет, 7 мес. назад.

Просмотр 9 сообщений - с 1 по 9 (из 9 всего)
  • Автор
    Сообщения
  • #4204

    mifon4ik
    Участник
    Сообщений:4

    Зарегистрирован:
    05.03.2016

    Репутация:0

    Если кратко, то решил добавить многопоточность. И столкнулся с проблемой того, что передавая цикл Event в отдельном потоке он не возвращает то или иное действие.
    Примерно так это выглядит:
    Функция с обработкой событий, которая идёт в цикле “пока открыто окно”.
    Потом всё как обычно. Создание окна и т.д.
    После идёт самый главный цикл – цикл “пока открыто окно”.
    И в нём передаю в отдельный поток переменную от RenderWindow. (Так же пробовал сделать поток до основного цикла, который просто идёт бесконечно)

    Но в итоге всё равно ничего не выходит. Он просто как будто даже не знает о том, что существует поток, который должен обрабатываться. А если делаю тоже самое, например, с обычными переменными типа int, float и далее, далее, далее, то всё в порядке. Он спокойно получает переменную, делает то, что запрошено и возвращает её изменённую.

    Подскажите, что не так с RenderWindow, что он не возвращает его в отдельном потоке?

    #4208
    RazorNd
    RazorNd
    Участник
    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

    Сформулируй свою проблему более чётко. Лучше с кусками исходного кода.

    #4210

    mifon4ik
    Участник
    Сообщений:4

    Зарегистрирован:
    05.03.2016

    Репутация:0

    В данном случае будет окно, которое не поддаётся никаким изменениям и даже закрыть нельзя. И лишь потому, что thread не возвращает данные именно окна. Пробовал тоже самое с другими переменными – всё в норме.
    Можно так же вместо цикла событий там пихнуть, например window.draw() и тот же результат будет. Он просто не отобразит.

    #4211
    RazorNd
    RazorNd
    Участник
    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

    Попробуй использовать вместо RenderWindow::pollEvent RenderWindow::waitEvent. Вот пример кода, который работает у меня: gist.github.com/RazorNd

    #4212

    mifon4ik
    Участник
    Сообщений:4

    Зарегистрирован:
    05.03.2016

    Репутация:0

    1. У вас используется функция join и ещё она после основного цикла. А мне надо чтобы она использовалась во время основного цикла. По этому я и использую detach. (Да, у вас работать будет и у меня с моим методом работало, но события не работали, а значит я просто не мог окно закрыть)
    2. Это не поможет решению. Мне даже проверять нет смысла, так как это не работает, как я и говорил, и для остальных функций, связанных с окном (Тот же window.draw, например).

    #4213
    RazorNd
    RazorNd
    Участник
    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

    1) Поток запускается сразу после создания объекта потока. Так что он будет работать параллельно с циклом. join метод синхронизации потоков, который в одном потоке ждет завершения другого. В этом вообще никакой разницы с твоим кодом нет, разве что главный поток ждет завершения работы потока цикла обработки событий.
    2) Рисовать ты действительно можешь только в одном потоке. Вот дока. Я же показываю как можно обрабатывать события в одном потоке и рисовать в другом. Я проверил этот код в linux с clang компилятором. Сейчас проверю в windows с visual studi0 2015. Но скорее всего и там оно работает.

    #4214

    mifon4ik
    Участник
    Сообщений:4

    Зарегистрирован:
    05.03.2016

    Репутация:0

    Понял тебя. Это значит я не совсем верно понял thread. Ну, ладно, с этим разобрались. Но мне всё-таки нужно ещё и рисовать в другом потоке (Например, для экрана загрузки. Для красоты – надо всё-таки). Как мне тогда это реализовать?

    #4215
    RazorNd
    RazorNd
    Участник
    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

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

    #4216

    mifon4ik
    Участник
    Сообщений:4

    Зарегистрирован:
    05.03.2016

    Репутация:0

    Ладно, спасибо. Буду разбираться.

Просмотр 9 сообщений - с 1 по 9 (из 9 всего)

Для ответа в этой теме необходимо авторизоваться.