Russian Qt Forum
Ноябрь 23, 2024, 04:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QThread и WaitForConnected.  (Прочитано 5212 раз)
C5.Jett
Гость
« : Июль 29, 2011, 16:09 »

Пишу тест в котором тестирую подключение и передачу/получение данных через QLocalSocket/QLocalServer в создаваемом мною потоке должен получить сообщение на один fifo и отправить через другой.
Функция читалка:
Код:
QString CConnLib::Read(const QString& host, unsigned int timeOut) {
  QLocalSocket* socket = new QLocalSocket();
  socket->connectToServer(host,QIODevice::ReadWrite);
  if(socket->waitForConnected(timeOut))
  {
    if(socket->waitForReadyRead(timeOut))
    {
      QString answer;
      quint16 blockSize=0;
      QDataStream in(socket);
      in.setVersion(QDataStream::Qt_4_0);
      if(blockSize==0) {
        if(socket->bytesAvailable()<(int)sizeof(quint16)) return QString("Read error1.") ;
        in>>blockSize;
      } else {
        if(socket->bytesAvailable()<(int)blockSize) return QString("Read error2.");
      }
      in>>answer;
      return answer;
    }
    else
    {
      return QString("Read error3.");
    }
  }
  else
  {
    return QString("Connection error!");
  }
}
Функция sender:
Код:
int CConnLib::Send(const QString& host,QString message,
                                          unsigned int timeOut) {
  QLocalServer server;
  if(server.listen(host))
  {
    if(server.waitForNewConnection(timeOut))
    {
      QByteArray block;
      QDataStream out(&block,QIODevice::WriteOnly);
      out.setVersion(QDataStream::Qt_4_0);
      out<<(quint16)0;
      out << message.toStdString().c_str();
      out.device()->seek(0);
      out<<(quint16)(block.size()-sizeof(quint16));
      QLocalSocket* conn = server.nextPendingConnection();
      QObject::connect(conn, SIGNAL(disconnected()),
                   conn, SLOT(deleteLater()));
      conn->write(block);
      conn->flush();
      conn->disconnectFromServer();
      return 0;
    }
    else
    {
      return -1;
    }
  }
  else
  {
    return -2;
  }
}
Код run() потока:
Код:
void MyThread1::run() {
  CConnLib l;
  qDebug("Client's running...\n");
  QString data;
  data = l.Read("id",5000);
  qDebug(data.toStdString().c_str());
  l.Send("report",data,5000);
  qDebug("Client's stoping...\n");

}
Код теста:
Код:
void ConnectorTest::ReadWriteTest()
{
  MyThread1 client;
  client.start();
  CConnLib lib;
  qDebug("Server's running...\n");
  QCOMPARE(lib.Send(QString("id"),"Hello, world!",5000),0);
  QCOMPARE(lib.Read(QString("report"),5000),QString("Hello, world!"));
  while(client.isRunning()==true){};
  qDebug("server's stoping...\n");
  qDebug("that's all...");
}

Помогите кто чем может!! Разбираюсь недавно и совсем в тупик заехал: каждый раз тест ведет себя по разному.Но в общем кажется, что в потоке функция read не ждет соединения. Заранее спасибо!
« Последнее редактирование: Июль 29, 2011, 16:20 от C5.Jett » Записан
ритт
Гость
« Ответ #1 : Июль 29, 2011, 16:59 »

насколько я могу понять, тест некорректен. начните с малого - стандартных примеров Qt (examples/ipc/localfortuneclient + examples/ipc/localfortuneserver)

з.ы. s/qDebug(data.toStdString().c_str());/qDebug() << data;/
Записан
C5.Jett
Гость
« Ответ #2 : Июль 29, 2011, 17:17 »

Примеры прочитал - там асинхронная работа, а мне нужно синхронно. Я вообще все это затеял чтобы соединить две проги: в линуксе я бы просто фифо создал  и все. А в windows - не ясно. Насчет теста: я правильно понимаю, что после того как я запустил поток - он выполняет то, что написано в run()?Если так, то после запуска теста, сервер ждет 5 сек входящего подключения, а ридер в потоке пытается 5 сек подключиться. Так вот иногда они подключаются, а иногда (тест исполняется гораздо меньше 5 сек) нет..А где же ожидание?
Записан
ритт
Гость
« Ответ #3 : Июль 29, 2011, 19:05 »

тест некорректен.

нужна синхронная работа - тогда зачем потоки вообще?
Записан
C5.Jett
Гость
« Ответ #4 : Июль 30, 2011, 07:24 »

Задача стояла, просто под виндой соеденить два Qt'шных приложения. Так что одно приложение запускает другое, создает поток, в котором посылает второму приложению запрос. Второе приложение при загрузке читает запрос (или висит до тех пор пока не придет запрос) И отсылает первому ответ. Поток первого его получает и передает родителю.Соответственно поток тоже должен висеть пока не придет ответ. +Хотелось бы это сделать весьма просто.
Записан
ритт
Гость
« Ответ #5 : Июль 30, 2011, 22:14 »

и именно поэтому Вы создаёте пайп то на клиенте, то на сервере?
а не проще ли будет использовать каналы только что запущенного процесса (http://doc.trolltech.com/latest/qprocess.html#setProcessChannelMode)?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 20.