2015-02-26 4 views
-2

Я пытаюсь прочитать TCP-порт с библиотеками Qt и программой GUI.Вопрос о чтении сокета Qt TCP

Проблема заключается в том, что, когда я использую этот код для чтения сокета:

QTcpSocket *a = new QTcpSocket(); 
a->connectToHost("127.0.0.1", 5000); 
a->read(data,LEN); 

это не работает, и мне нужно поставить дополнительную функцию:

a->waitForReadyRead(1) 

, но эта функция замедляет свою программу , Я использую pthread для постоянного запуска этого кода. У меня вопрос, как я могу ускорить свою программу, а также прочитать данные успешно?

ответ

0

Чтобы считывать данные сокета асинхронно, необходимо использовать цикл событий Qt и подключить сигнал «данные доступны». Синтаксис соединения в вашем случае может выглядеть следующим образом:

QObject::connect(s, &QTcpSocket::readyRead, yourReaderFunction); 

Ваш цикл программы должен содержать вызов функции QApplication::processEvents() обработки событий, или вы можете использовать встроенный в цикле QApplication::exec().

Сигналы и слоты механизм является основной особенностью Qt, и вы должны понять и использовать его должным образом, чтобы взаимодействовать с большинством классов Qt:

Signal and slot basics

Qt5 new signal and slot syntax

+0

Я знаю, что вы имеете в виду, и я использовал этот способ, но в потоке я думаю, что у меня нет доступа к памяти программы отдыха. – ntosis

+0

Также возникает вопрос, могу ли я потерять свои данные, когда чтение выполняется быстрее, чем процесс, и сигнал события соединения не синхронизирован в аттре? – ntosis

+0

@ntosis вы можете изменить свой вопрос, чтобы показать код потока. Вы можете * только * получить доступ к сокету из потока, в котором он был создан (потому что Qt будет «утверждать» в противном случае, независимо от вашего мьютексирования или других функций безопасности потокового потока), и нетривиально убедиться, что вы создаете сокет в потоке, который, по вашему мнению, соответствует правильному циклу событий и контексту для очереди в очереди. –

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

  • Нет связанных вопросов^_^