LINUX.ORG.RU

История изменений

Исправление slackwarrior, (текущая версия) :

Как не делать? Просто примера нормального нет перед глазами...

Ну зделай чтоб Run чего-то делал кроме ожидания, например чего-то посчитал и вызвал себе Stop :) В отладке например посмотри, что там происходит. Если снаружи управлять — нужно логическую переменную или мутексом защищать или, как во втором примере, семафор накручивать (хотя это у них какие-то устаревшие привычки — как будто не было RAII или более удобных примитивов синхронизации чем семафор).

А тут прям страдания какие-то.

Ну, надо учитывать что про 2003 год это я тебе не просто так сказал :) Тяжелое наследие велосипедного плюсизма родом с оффтопика.

Что будет запускать Run? Я должен просто Init вызвать, а Run сам запустится???

У них тут немножк по-наркомански сделано (хотя раньше это «идиомой» кое-кто считали) — класс, в котором поток «физически» создается колом FRunnableThread::Create, передает «себя» (свои инстанс) в параметре этого кола (видишь там this?) Ну вот, поток, т.к. он уже создан, уже будет запускать Run() когда ты дернешь Init, т.е отдельно его (Run) дергать не надо, как тут и показано https://wiki.unrealengine.com/Multi-Threading:_How_to_Create_Threads_in_UE4#S...

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

Это все можно делать по-другому — т.е. «воркеры» эти не делать обертками потоков, а тупо задачами для поточного пула, в котором потокам пофиг кого «исполнять» — видимо с синхронизацией морочиться автор твоего примера не хотел, но тогда хотя бы надо что-то вроде точки ожидания в основном). И собственно пример использования всегда лучше искать, чтоб вопросов не возникало :)

А как выводить отладочный текст в потоках?

И кстати об отладке — хотя автор твоего примера пишет про то что логи использоват не айс, но он просто жопа ленивая — и не стал морочиться с синхронизацией — просто можно защитить лог примитивом синхронизации.

Тут чувак просто использует Glog->Log() и не трахает себе моск, т.к. поток один:

https://orfeasel.com/implementing-multithreading-in-ue4/

Но у UE4 не один способ делать асинхронные задачи, может тебе подойдет:

https://wiki.unrealengine.com/Using_AsyncTasks

или

https://wiki.unrealengine.com/Multi-Threading:_Task_Graph_System

Если «просто потоки» — тогда копай в сторону синхронизаций, пулов и т.д. (возможно что-то придется написать самому, просто чтоб удобнее было).

И общее правило буравчика — хорошо подумать, нужны ли потоки под твою задачу, т.к. UE4 сам не сильно поточный, особенно для блю-принтов https://global.gotomeeting.com/join/671646925 :)

А тут написано где собственно блокировка происходит естественным путем: https://docs.unrealengine.com/en-us/Programming/Rendering/ThreadedRendering

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

Исходная версия slackwarrior, :

Как не делать? Просто примера нормального нет перед глазами...

Ну зделай чтоб Run чего-то делал кроме ожидания, например чего-то посчитал и вызвал себе Stop :) В отладке например посмотри, что там происходит. Если снаружи управлять — нужно логическую переменную или мутексом защищать или, как во втором примере, семафор накручивать (хотя это у них какие-то устаревшие привычки — как будто не было RAII или более удобных примитивов синхронизации).

А тут прям страдания какие-то.

Ну, надо учитывать что про 2003 год это я тебе не просто так сказал :) Тяжелое наследие велосипедного плюсизма родом с оффтопика.

Что будет запускать Run? Я должен просто Init вызвать, а Run сам запустится???

У них тут немножк по-наркомански сделано (хотя раньше это «идиомой» кое-кто считали) — класс, в котором поток «физически» создается колом FRunnableThread::Create, передает «себя» (свои инстанс) в параметре этого кола (видишь там this?) Ну вот, поток, т.к. он уже создан, уже будет запускать Run() когда ты дернешь Init, т.е отдельно его (Run) дергать не надо, как тут и показано https://wiki.unrealengine.com/Multi-Threading:_How_to_Create_Threads_in_UE4#S...

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

Это все можно делать по-другому — т.е. «воркеры» эти не делать обертками потоков, а тупо задачами для поточного пула, в котором потокам пофиг кого «исполнять» — видимо с синхронизацией морочиться автор твоего примера не хотел, но тогда хотя бы надо что-то вроде точки ожидания в основном). И собственно пример использования всегда лучше искать, чтоб вопросов не возникало :)

А как выводить отладочный текст в потоках?

И кстати об отладке — хотя автор твоего примера пишет про то что логи использоват не айс, но он просто жопа ленивая — и не стал морочиться с синхронизацией — просто можно защитить лог примитивом синхронизации.

Тут чувак просто использует Glog->Log() и не трахает себе моск, т.к. поток один:

https://orfeasel.com/implementing-multithreading-in-ue4/

Но у UE4 не один способ делать асинхронные задачи, может тебе подойдет:

https://wiki.unrealengine.com/Using_AsyncTasks

или

https://wiki.unrealengine.com/Multi-Threading:_Task_Graph_System

Если «просто потоки» — тогда копай в сторону синхронизаций, пулов и т.д. (возможно что-то придется написать самому, просто чтоб удобнее было).

И общее правило буравчика — хорошо подумать, нужны ли потоки под твою задачу, т.к. UE4 сам не сильно поточный, особенно для блю-принтов https://global.gotomeeting.com/join/671646925 :)

А тут написано где собственно блокировка происходит естественным путем: https://docs.unrealengine.com/en-us/Programming/Rendering/ThreadedRendering

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