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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QLocalServer/Socket обмен данными  (Прочитано 6292 раз)
borya95
Гость
« : Апрель 04, 2014, 12:43 »

Как правильно реализовать постоянный прием и отправку данных между двумя процессами с помощью QLocalServer и QLocalSocket. На данный момент реализованно таким образом:

Серверная часть:
Код:
void thread1::run(){

    QString name="r111";
    if (!mw->m_server.listen(name)) {
          qDebug() << "Not able to start the Server";
     }
        mw->m_server.listen(name);
        connect(&mw->m_server, SIGNAL(newConnection()), this, SLOT(socket_new_connection()));
       
      exec();
  }




void thread1::socket_new_connection() {
    QLocalSocket *clientConnection = mw->m_server.nextPendingConnection();
    clientConnection->read(buf,2404);
    //QByteArray in(clientConnection->readAll());
    //char *data = in.data();
    memcpy(&a,&buf[0],4);
    memcpy(&b,&buf[4],2400);
    connect(clientConnection, SIGNAL(disconnected()),
                clientConnection, SLOT(deleteLater()));
    emit toMainWidget();

}

Клиентская часть:
Код:

ProcessingThread::ProcessingThread()
{

    m_socket = new QLocalSocket(this);
    m_serverName = "r111";

       connect(m_socket, SIGNAL(connected()), this, SLOT(socket_connected()));
       connect(m_socket, SIGNAL(disconnected()), this, SLOT(socket_disconnected()));

       connect(m_socket, SIGNAL(readyRead()), this, SLOT(socket_readReady()));
       connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)),
               this, SLOT(socket_error(QLocalSocket::LocalSocketError)));


}
void ProcessingThread::send_MessageToServer() {
    m_socket->abort();
    m_socket->connectToServer(m_serverName);



}


void ProcessingThread::socket_connected(){
    u_short *from = (u_short*)b ;
    memcpy(&msg[0],&a,4);
    memcpy(&msg[4],from,2400);
    m_socket->write(msg);
    m_socket->flush();
}

При данной реализации, прием происходит только один раз, после чего gui интерфейс замораживается.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Апрель 05, 2014, 11:36 »

Выбросить треды.
Записан

ArchLinux x86_64 / Win10 64 bit
borya95
Гость
« Ответ #2 : Апрель 06, 2014, 17:18 »

Выбросить треды.
а они чем мешают?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Апрель 08, 2014, 09:35 »

Если линукс - то смотрите в сторону DBUS, довольно просто и не сложно + поддерживается Qt. В остальных ОС можно по разному.
Можно банально создать соединение по обычным сокетам. В линуксе есть и локальные сокеты (unix сокеты).
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Апрель 08, 2014, 18:14 »

Цитировать
а они чем мешают?

А тем, что если не умеешь ими пользоваться и у тебя "замораживается" ГУЙ, то - лучше выброси их, т.к. толку ноль.  Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
borya95
Гость
« Ответ #5 : Апрель 10, 2014, 11:46 »

Цитировать
а они чем мешают?

А тем, что если не умеешь ими пользоваться и у тебя "замораживается" ГУЙ, то - лучше выброси их, т.к. толку ноль.  Улыбающийся

ну так просвети где ошибка
Записан
borya95
Гость
« Ответ #6 : Апрель 10, 2014, 11:49 »

Если линукс - то смотрите в сторону DBUS, довольно просто и не сложно + поддерживается Qt. В остальных ОС можно по разному.
Можно банально создать соединение по обычным сокетам. В линуксе есть и локальные сокеты (unix сокеты).
я пробовал d-bus и пайпы , но они по пропускной способности не подошли, т.к. идет частый обмен сообщениями по 2500 байт, на глазок где-то каждые 2-3 мс.
upd : OS Linux
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #7 : Апрель 13, 2014, 10:05 »

можете использовать  socket_pair.
Записан
borya95
Гость
« Ответ #8 : Апрель 14, 2014, 12:28 »

можете использовать  socket_pair.
спасибо попробую
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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