2013-07-20 10 views
1


Я хочу задать вопрос об архитектуре приложения
1. Будет основной поток GUI для обеспечения взаимодействия пользователя
2. Получать поток на основе UDP-сокета, который будет получать пакеты UDP (0)
3. Другой поток для отправки событий, а также периодических UDP-пакетов.

Как реализовать эту архитектуру в Qt, в основном у меня есть следующие вопросы:
1. Для получения темы , как мне сделать это блокирование?
Я знаю о сигнале readyRead(), и я могу подключить его к некоторому слоту, который будет обрабатывать дейтаграмму, но как это сделать, чтобы этот поток выполнял это навсегда.

2. В send Thread я могу сгенерировать сигнал из потока GUI, который будет приниматься потоком передачи, и слот здесь будет записывать некоторые данные в сокет, но опять же, как этот поток сохранится, когда ему нечего послать, Я имею в виду цикл, опрос чего-то?Qt блокирующие потоки и связь между потоками

ответ

1

Использовать циклы событий во вторичных потоках.

QThread::exec() запускает цикл событий потока, который будет работать до тех пор, пока не вызывается QThread::quit(). Это должно решить вашу проблему «как подождать, пока что-то случится». По умолчанию реализация QThread::run() просто вызывает exec(), поэтому я бы пошел с этим. Вы можете настроить все в своем методе main(), например. для отправителя резьбы:

//Create UI 
MainWindow mainWindow; 
mainWindow.show(); 

//set up sender thread and the QObject doing the actual work (Sender) 
QThread senderThread; 
Sender sender; //the object doing the actual sending 
sender.moveToThread(&sender); //move sender to its thread 
senderThread.start(); //starts the thread which will then enter the event loop 

//connect UI to sender thread 
QObject::connect(&mainWindow, SIGNAL(sendMessage(QString)), &sender, SLOT(sendMessage(QString)), Qt::QueuedConnection); 

... 

const int ret = app.exec(); // enter main event loop 

senderThread.quit(); //tell sender thread to quit its event loop 
senderThread.wait(); //wait until senderThread is done 

return ret; // leave main 

Отправитель будет просто QObject с SendMessage() слот делает отправку, а QTimer плюс еще один слот для периодических пакетов UDP и т.д.

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