CPU x86 800 Мгц. ОС - xlinux. Qt embedded 4.5.3.
Есть необходимость общаться с внешними устройствами через интервалы порядка 1 мс.
Данные будут формироваться в одном потоке, затем отдаваться одному или двум другим, которые уже непосредственно общаются с внешними устройствами (дизайн условный, сделан для проверки возможностей проца, операционки и qt).
Обнаружил, что если передавать сообщения от первого потока с помощью системы сигнал/слот то загрузка процессора очень высокая (если отдавать сообщения одному потоку то ~1%, если двум то ~85%). Если же вместо системы сигнал/слот использовать семафоры то загрузка проца близка к 0.
Для проверки сделал два примера:
1.Пример 1 Первый поток спит 1 мс и затем шлет сигнал который связан со слотами задач выдающих данные в порт.
C++ (Qt)
void Data::run() {
forever {
usleep(1000);
emit timeoutSignal();
}
}
В потоке общающемся с внешним устройством (таких потока один или два) просто запускается цикл обработки сообщений и описан слот:
C++ (Qt)
void Port::run() {
exec();
}
void Port::timoutSlot() {
write_data_to_port();
}
Сигналы/слоты связаны так:
C++ (Qt)
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Data *data = new Data();
Port *port1 = new Port(1);
Port *port2 = new Port(2);
QObject::connect(data, SIGNAL(timeoutSignal()), port1, SLOT(timeoutSlot()));
QObject::connect(data, SIGNAL(timeoutSignal()), port2, SLOT(timeoutSlot()));
port1->start();
port2->start();
port1->moveToThread(port1);
port2->moveToThread(port2);
data->start();
return a.exec();
data->quit();
port1->quit();
port2->quit();
}
2.Пример 2Первый поток спит 1 мс и затем шлет семафор.
C++ (Qt)
void Data::run() {
forever {
usleep(1000);
sem_post(sem);
}
}
Второй поток (их один или два) ждет семафор и пишет в порт:
C++ (Qt)
void Port::run() {
forever {
sem_wait(sem);
write_data_to_port();
}
}
В первом примере загрузка проца ~85%, во втором близка к нулю. Оба варианта работают, данные передаются.
Все сигналы/слоты в первом примере выполняются в своих потоках - проверял.
Действительно ли система сигнал/слот настолько медленно работает или я что-то делаю не так?Хотелось бы использовать сигналы/слоты поскольку в реальном приложении одному потоку потребуется обрабатывать разные сообщения от нескольких потоков и нельзя просто ждать один семафор. А проверять пришли ли сообщения в цикле не хочется.