Как правильно получать непрерывно обрабатываемые данные из потока? - PullRequest
0 голосов
/ 11 июля 2019

Следующие функции и поля являются частью одного и того же класса в DLL-библиотеке Visual Studio. Данные постоянно читаются и обрабатываются с использованием функции run в потоке. Тем не менее, getPoints доступен в приложении Qt на QTimer. Я не хочу пропустить ни одного обработанного вектора, потому что кажется, что он может пропустить, приводя к скачкам данных. Какой самый безопасный способ получить очки за обновленную версию?

Если возможно, я бы хотел получить ответ, который использует стандартную библиотеку C ++, так как я изучал мьютексы, но, похоже, он все еще приводит к нестабильным данным.

vector<float> points;
// std::mutex ioMutex;

// function running on a thread
void run(){
    while(running){
        //ioMutex.lock()
        vector<byte> data =  ReadData()
        points = processData(data);
        //ioMutex.unlock()
    }
}

vector<float> getPoints(){
    return points;
}

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Самый безопасный (и, вероятно, самый простой) способ доставить ваши точечные данные в основной поток - это вызвать qApp->postEvent() с объектом пользовательского подкласса QEvent, который содержит ваш vector<float> в качестве переменной-члена.

Это приведет к тому, что метод event(QEvent *) (независимо от того, какой объект Qt вы указали в качестве первого аргумента для postEvent()) будет вызываться из потока main / GUI, и поэтому вы можете переопределить этот метод для чтенияvector<float> из объекта подкласса QEvent и обновите графический интерфейс с этими данными.

0 голосов
/ 11 июля 2019

Я считаю, что в вашем коде есть ошибка.Цикл while будет поглощать всю активность процесса и не будет обеспечивать надлежащую функциональность других функций.В Qt в таких непрерывных циклах обычно полезно использовать следующее, потому что на самом деле он дает другому процессу время для правильного доступа к буферу событий.Если эта dll написана на Qt, пожалуйста, добавьте следующее в цикл while

QCoreApplication::processEvents();
...