После прочтения некоторых статей как это о связях Qt Signal-Slot у меня все еще возникает вопрос о соединении в очереди.
Если у меня есть потоки, которые все время передают сигналы друг другу и говорят, что один thread_slow
работает медленный метод в этом цикле событий, а другой thread_fast
работает с быстрым, который посылает несколько сигналов, а другой поток все еще работает медленный метод..... когда медленный метод из thread_slow
возвращается в цикл событий, будет ли он обрабатывать все сигналы, которые были отправлены ранее, на thread_fast
или только последний (все сигналы являются такой же тип)?
Если он обработает все сигналы, есть ли способ сделать thread_slow
обработать только последний? (Рассмотрение "последнего" в многопоточном приложении может быть неопределенным, пусть рассмотрим последний сигнал перед тем, как поток попросит последний сигнал, для простоты, поэтому новые отправляются, когда поток ищет последний, может быть потерян).
(Я спрашиваю об этом, потому что у меня есть несколько потоков, получающих данные из нескольких потоков, и я не хочу, чтобы они обрабатывали старые данные, только последний, который был отправлен)
Я провел несколько тестов, и, похоже, Qt обработает все сигналы. Я сделал один поток:
while(true)
{
QThread::msleep(500);
emit testQueue(test);
test++;
}
и слот в другом будет:
void test::testQueue(int test)
{
test.store(private_test.load() + test);
emit testText(QString("Test Queue: ") + QString::number(private_test.load()));
}
и поток будет запущен:
while(true)
{
QThread::msleep(3000);
QCoreApplication::processEvents();
private_test.store(private_test.load() + 1000);
}
Я посылаю сигнал от одного потока к другому каждые 500 миллисекунд, а другой поток спящий за 3000 миллисекунд (3 секунды), а затем просыпается и увеличивает внутреннюю переменную на 100. каждый раз, когда слот выполняется, он испускает текст с полученным значением + внутренняя переменная. Результатом, который я получаю, является то, что каждый раз, когда вызывается QCoreApplication::processEvents();
, все сигналы выполняются.... (я отредактировал эту часть, потому что обнаружил ошибку в моем предыдущем коде)