Это домашнее задание, поэтому просто некоторые концептуальные советы будут приятными.QT readReady() TCPSocket не получает сообщение до тех пор, пока оно не понадобится
В момент создания проекта клиентского сервера клиент отправит сообщение на сервер (эта часть отлично работает), но затем сервер отправляет сообщение клиенту, и именно здесь я начинаю испытывать проблемы , Я создал отдельный класс в QT под названием Connection Management в моем клиенте, который занимается отправкой принимающих сообщений, этот класс используется моим классом Controller, который обрабатывает логику приложения всех моих страниц пользовательского интерфейса, теперь, когда мой контроллер отправляет сообщение на сервер, сообщение отправлено обратно, atm. У меня это как эхо, мой класс ConnectionManagement обрабатывает сообщения Incomming с сигналом readyRead(), проблема здесь в том, что кто-то использует мой клиент и говорит, нажмите следующую кнопку, следующий будет вызываться слот кнопки, и подождите, пока после выполнения NextButtonPressed() или w/e. до тех пор, пока чтение не будет прочитано, что-то будет отправлено обратно, я попытался прочитать сообщение, которое я могу вызывать вручную, но он не работает, если он работает.
маленький кусочек моего кода:
ConnectionManager.cpp
ConnectionManager::ConnectionManager(QObject *parent)
: QTcpServer(parent)
{
socket = new QTcpSocket(this);
connect(socket, SIGNAL(readyRead()), this, SLOT(readyread()));
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnect()));
socket -> connectToHost("192.168.0.119",60000);
}
QString ConnectionManager::getMessage()
{
//sleep(1);
while (inMessage == "")
{
//my attempt at calling read() manually it will read nothing
QByteArray data = socket->readAll();
//just checkign what i am getting my server will immediately return a trivial
//string i.e "carly, santos, andrew, bob"
std::cout << data.data() << "+ 8" << std::endl;
inMessage = data;
}
return inMessage;
}
void ConnectionManager::sendMessage(QString &message)
{
socket -> write(message.toUtf8());
}
//my socket for reading whenever something is sent?
void ConnectionManager::readyread()
{
QByteArray data = socket->readAll();
inMessage = data;
std::cout << data.data() << "+ 1" << std::endl;
}
нормально теперь мой controller.cpp
void Controller::openTALogin()
{
//TODO send message to Server
QString buffer = Fill::fillBufferState("Client", "TA");
//std::cout << buffer.toUtf8().data() << std::endl;
myConnection->sendMessage(buffer); // <- this works great =)
//sleep(7);
std::cout << "1234" << std::endl;
QString in = myConnection -> getMessage(); //<- gets nothing -.-
std::cout << in.toUtf8().data() << "+ 12" << std::endl;
//TODO recieve List from server
//ForNow
QLinkedList<QString> *testList = new QLinkedList<QString>();
Fill::fillLinkedList(testList, in);
//testList -> push_front("jabba:5:hut:1");
//testList -> push_front("blind:3:mice:2");
//testList -> push_front("eat:5:day:3");
//testList -> push_front("hello:4:goodbye:4");
delete userWindow;
taLoginWindow = new TALoginWindow(this, testList);
taLoginWindow -> show();
testList -> clear();
delete(testList);
}
сообщение получено здесь после того, как эта функция выполняется, я помню форму, используя C-Style TCP/IP-соединение, прочитанное будет ждать, пока данные не будут продолжены, но, похоже, это не круто с получением ничего здесь?
вы блокировании внутри метода NextButtonPressed()? Если да, не делайте этого. Чтобы цикл событий Qt выполнялся своевременно, все методы в потоке Qt/GUI должны возвращаться как можно быстрее. –
моя следующая кнопка нажала метод, например, просто вызовет openNextPage контроллеров, в этом случае это будет OpenTALoginWindow(), я не верю, что я блокирую что-либо, однако я считаю, что там есть 2 потока управления, которые бросают мою программу за скажем, тот, который пользователь контролирует представление, позволяет вызывать его навигацию по страницам, а затем есть управление соединением, в котором сигналы могут быть отправлены с сервера в любое время технически, это имеет смысл? Я думаю, что мне нужно приостановить выполнение функции и управлять связью соединений, чтобы проверить наличие обновлений, есть ли способ сделать это? –