void OnDownloadComplete(...) { if (DownloadSynchronizationEvent) { UE_LOG(LogTexture, Log, TEXT(">>> RMP: FRmpManagedTextureLoadAsyncTask::OnDownloadComplete [%p] Triggering the download complete event"), this); DownloadSynchronizationEvent->Trigger(); } }
А ты уверен, что у тебя эвент раньше создаётся, чем выстреливается коллбэк?
@harrm @devnova @AJIADb9 В общем, если интересно, я нашёл проблему. 1. Отправлялось несколько десятков/сотен асинхронных тасков на загрузку в фоне. 2. Таски все валились в один и тот же момент на обработку, без какой-либо очереди. 3. Таскам требовалась "принудительная" синхронность (нужно было выполнить HTTP запрос и долждаться его завершения прежде чем продолжать выполнение, иначе задача считалась выполненной, но результата не получалось). 4. Я решал это использованием блокирующих поток/тред эвентов системных. 5. Получалось так, что из-за обилия тасков, все доступные потоки блокировались, при этом HTTP запросы, судя по всему, также должны были на этих самых рабочих потоках выполняться, но из-за блокировки этого не срабатывало. Решение - очередь и ограничение количества подобных тасков, как у меня изначально оно и было сделано, но что я посчитал излишним и выпилил во время оптимизации.
хахх, если у тебя от обилия тасков внезапно переставали работать тики - добро пожаловать в клуб! :D
В общем, на компах "целевой аудитории" бывает по 2-4 ядра. И, судя по всему, соответственно, примерно по 4 рабочих потока. Даже если делать в 4 потока загрузку - встаёт колом. Очень печально :)
Synch эвентами это по идее разруливается, стака не должно быть
Ну вот я ими и разруливаю.
Обсуждают сегодня