Как полностью выйти из QThread с ожидающими сигналами QueuedConnection?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как полностью выйти из QThread с ожидающими сигналами QueuedConnection?

Сообщение Anonymous »

У меня есть пара объектов QObject. Я назову их DataReceiver и DataProcessor, которые инкапсулированы внутри объекта DataHandler
DataReceiver работает на QThread. Когда QThread запускается, вызывается DataReceiver:run(), который повторяется до тех пор, пока не будет получен приказ остановиться с помощьюatomic_bool.

Код: Выделить всё

DataReceiver::run()
{
this->stop = false;
while(!stop)
{
//Receive data
emit data_ready(data);
}
}
DataProcessor также находится в своем собственном потоке, но запускается только тогда, когда сигнал исходит от DataReceiver.
Вот как будет выглядеть DataHandler.h:

Код: Выделить всё

class DataHandler
{
public:
DataHandler();
~DataHandler();

private:
QThread data_processing_thread;
QThread data_receiver_thread;

DataReceiver data_receiver;
DataProcessor data_processor;
};
Я соединяю эти объекты со слотами/сигналами и потоками Qt в конструкторе DataHandler следующим образом:

Код: Выделить всё

DataHandler::DataHandler() {
connect(&data_receiver_thread, &QThread::started, &data_receiver,
&DataReceiver::run);

connect(&data_receiver, &DataReceiver::data_ready, &data_processor,
&DataProcessor::process);

data_receiver.moveToThead(&data_receiver_thread);
data_processor.moveToThread(&data_processor_thread)

data_receiver_thread.start();
data_processor_thread.start();
}
Проблема возникает, когда этим объектам пора выйти за пределы области видимости. DataReceiver отправил 200 сигналов для обработки DataProcessor, но DataProcessor не смог обработать достаточно быстро, и ему еще предстоит обработать большое количество сигналов. На данный момент это происходит так:

Код: Выделить всё

DataHandler::~DataHandler() {

data_receiver.stop = true; // Signal the data_receiver to while loop to stop
data_receiver_thread.quit();
data_receiver_thread.wait();

data_processor_thread.quit();
data_processor_thread.wait();

} //data_receiver and data_processor will go out of scope here
Итак, мой вопрос: что происходит с ожидающими сигналами, которые не были обработаны?
Они очищаются, когда data_processor или когда объект data_processor_thread выходит за пределы области действия? Есть ли лучший способ аккуратно выйти? При остановке я хочу, чтобы оставшиеся ожидающие сигналы были отменены, чтобы мы могли остановиться как можно быстрее.
Причина вопроса заключается в том, что документации по управлению памятью не так много, и я хочу постараться максимально избежать утечек памяти.

Подробнее здесь: https://stackoverflow.com/questions/764 ... on-signals
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»