Почему лямбда-функция не копирует структуру? - PullRequest
0 голосов
/ 18 марта 2020

Я изменяю базу кода, чтобы получить структуру (TheClipInfo) из лямбды, чтобы я мог вернуть одно из ее свойств (CurrentFrameCount).

Я думаю, что передаю его по ссылке, но явно что-то упускаю.

Комментарии ниже показывают, где я изменил код.

int32 UTimeSynthComponent::StopClipOffset(FTimeSynthClipHandle InClipHandle, ETimeSynthEventClipQuantization EventQuantization)
{
    Audio::EEventQuantization StopQuantization = GlobalQuantization;
    if (EventQuantization != ETimeSynthEventClipQuantization::Global)
    {
        int32 ClipQuantizationEnumIndex = (int32)EventQuantization;
        check(ClipQuantizationEnumIndex >= 1);
        StopQuantization = (Audio::EEventQuantization)(ClipQuantizationEnumIndex - 1);
    }

    FPlayingClipInfo TheClipInfo;  // I want the Lambda to put data here.

    SynthCommand([this, InClipHandle, StopQuantization, &TheClipInfo]  // The first Lambda
    {
        EventQuantizer.EnqueueEvent(StopQuantization,

            [this, InClipHandle, &TheClipInfo](uint32 NumFramesOffset)  // The Second Lambda
            {
                int32* PlayingClipIndex = ClipIdToClipIndexMap_AudioRenderThread.Find(InClipHandle.ClipId);
                if (PlayingClipIndex)
                {
                    // Grab the clip info
                    FPlayingClipInfo& PlayingClipInfo = PlayingClipsPool_AudioRenderThread[*PlayingClipIndex];  // The Struct I want to get out.

                    // Only do anything if the clip is not yet already fading
                    if (PlayingClipInfo.CurrentFrameCount < PlayingClipInfo.DurationFrames)
                    {
                        // Adjust the duration of the clip to "spoof" it's code which triggers a fade this render callback block.
                        PlayingClipInfo.DurationFrames = PlayingClipInfo.CurrentFrameCount + NumFramesOffset;
                    }
                    TheClipInfo = PlayingClipInfo;  // I think this should make a copy.
                }
            });
    });
    return TheClipInfo.CurrentFrameCount;  // This is always returning 0.
}

I ' м, если предположить, что все это происходит в одном и том же потоке и по порядку (не некоторый асинхронный c обратный вызов, такой как JavaScript).

Моя первая попытка была с int32, но она не может быть передана по ссылке , Я действительно хочу получить только одно значение.

1 Ответ

0 голосов
/ 18 марта 2020

Snap!

EventQuantizer.EnqueueEvent

Добавляет вторую лямбду в очередь событий. Так что это асинхронно. Вот почему он не работает так, как мне хотелось бы.

Самое простое, что может сработать, - это скопировать код из лямбды и использовать его для возврата.

...