История изменений
Исправление 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
Ну вощем, раскопки в сорцах наиболее полезные в смысле понять чо-как энивей, т.к. кулстори индусов, которые пишут примеры скорее надо проверять, чем доверять.