2013-12-09 3 views
0

Это домашнее задание, поэтому просто некоторые концептуальные советы будут приятными.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-соединение, прочитанное будет ждать, пока данные не будут продолжены, но, похоже, это не круто с получением ничего здесь?

+0

вы блокировании внутри метода NextButtonPressed()? Если да, не делайте этого. Чтобы цикл событий Qt выполнялся своевременно, все методы в потоке Qt/GUI должны возвращаться как можно быстрее. –

+0

моя следующая кнопка нажала метод, например, просто вызовет openNextPage контроллеров, в этом случае это будет OpenTALoginWindow(), я не верю, что я блокирую что-либо, однако я считаю, что там есть 2 потока управления, которые бросают мою программу за скажем, тот, который пользователь контролирует представление, позволяет вызывать его навигацию по страницам, а затем есть управление соединением, в котором сигналы могут быть отправлены с сервера в любое время технически, это имеет смысл? Я думаю, что мне нужно приостановить выполнение функции и управлять связью соединений, чтобы проверить наличие обновлений, есть ли способ сделать это? –

ответ

1

вы делаете вашу отправить сообщение, а затем сразу же попытаться получить Быстродействие, это не будет работать, потому что нужно вернуться в цикл обработки событий, прежде чем что-либо можно записать или прочитать

разделить ваш метод Controller::openTALogin в 2

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 =) 
} 

void Controller::gotResponce(QString in) 
{ 

    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); 

} 

и вторая часть называется в вашем readyRead:

void ConnectionManager::readyread() 
{ 
    QByteArray data = socket->readAll(); 
    inMessage = data; 
    std::cout << data.data() << "+ 1" << std::endl; 
    emit recievedMessage(QString(inMessage)); // using signal here 
} 
+0

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

+0

Я немного запутался в использовании сигналов здесь, поэтому я испускаю сигнал, с чем он связан? и в вашем полученном ответе переменная 'in' не объявлена, это intntional? –

+1

вы подключаете сигнал myConnection 'receivedmedessage' к' Controller :: gotResponce', а in - параметр этого –

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