2016-05-30 4 views
0

У меня есть функция, которая передает данные в мое приложение в потоке, в классе (A). Данные копируются в пользовательский структуры (StructStore) в файле заголовка другого класса (B):Как мне скопировать значения изнутри потока обратно в основной поток?

.h

class Data: 
public: 
    StructStore DataStore; 

.cpp

Data dd; 

    StructStore DataIn; // data streams in 

    dd.DataStore = DataIn; 

Когда я добавить точку останова и проверьте значения здесь (внутри потока), они будут такими, как я ожидал бы, как в DataStore, так и в DataIn.

Что мне нужно, это вызывать эти значения из-за пределов потока в еще одном классе (C). Я пытаюсь:

.cpp

StructStore Result; 
    Data d; 

    Result = d.DataStore; 

Когда я проверяю значения здесь, они всегда равны нулю. Что я здесь делаю неправильно? Как можно безопасно копировать эти значения за пределы потока?

+0

Возможно, вы захотите защитить себя от условий гонки и использовать какой-либо механизм защиты, например 'std :: mutex'. –

+1

Какую библиотеку потоков вы используете? Возможно ли предоставить [минимальный код] (http://stackoverflow.com/help/mcve) или хотя бы немного больше? – coyotte508

+0

Я пишу плагин для нереального двигателя, потоки выполняются с использованием класса FRunnable: https://docs.unrealengine.com/latest/INT/API/Runtime/Core/HAL/FRunnableThread/index.html – anti

ответ

1

Один простой и безопасный (но не самый эффективный 100%) способ - использовать pipe. Просто прочитайте свой основной поток (блокируя только один рабочий поток или используя select(), если ждать несколько труб). Затем создайте рабочий поток write(). Вы даже можете иметь несколько потоков, записывающих в трубу одновременно, без блокировки, если размер каждой записи меньше PIPE_BUF байт.

+0

Спасибо! Это опция для окон? – anti

+0

он будет очень медленным для игры 3D-шутера. Я предлагаю вам посмотреть здесь http://www.modernescpp.com/index.php/threads-sharing-data – strangeqargo

Смежные вопросы