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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: QTcpSocket заезжанная тема !!!!!!!!!!  (Прочитано 20078 раз)
Денис
Гость
« Ответ #30 : Май 31, 2015, 21:30 »

Ну если честно, не вижу особой прибавки к быстродействию. Переключение потоков при большом количестве клиентов съест всю разницу Улыбающийся

Хотя, как говорится это две стороны одной медали. И так и так можно, просто я ниразу не реализовывал принцип поток на клиент, ибо считаю избыточным.



Ты предлагаешь в потоках разместить сокеты а клиентов в основном потоке ?
Записан
Bepec
Гость
« Ответ #31 : Июнь 01, 2015, 00:12 »

Да нет, предлагаю свести к


                                                 [Server]
                                                      |
[                            передающий-принимающий поток                              ]
     |         |         |         |         |         |         |         |         |         |         |   
[client][client][client][client][client][client][client][client][client][client][client]

Хотя тут ещё вопрос о количестве и качестве клиентов возникает и нужны подробности об обмене - объемы, интенсивность.

В чём плюсы - фактически клиенты не будут знать ничего о том, как куда и в какой форме отправляются данные, вся прием передача в одном месте (т.е. логирование и отлов ошибок упрощается). Возможен контроль клиентов. Сколько упало, сколько подключено и далее. Эдакий шлюз.

В чем минусы - один поток обрабатывает все данные. Ошибки и прочая валят весь приём передачу (ошибки программиста Веселый). Т.е. все клиенты будут зависеть от его работы. Вот тут вопрос об объемах встаёт.

PS с другой стороны на очень быстрый обмен Qt не годится, Qt медленный по сути.

Есть ещё вариант когда каждый клиент имеет свой сокет. Т.е.


[                                                              Server                                                                      ]
                  |                   |                   |                   |                   |                   |                   |         
       [client-socket][client-socket][client-socket][client-socket][client-socket][client-socket][client-socket]

Плюсы - каждый клиент независим, нет проблем влияющих на соседние клиенты.

Минусы - Логирование затруднено. Отлов ошибок затруднён. Проблема с синхронизацией и обратной связью.


Но в любом случае оба варианта живут дышат и работают. Вам выбирать Улыбающийся
Записан
Денис
Гость
« Ответ #32 : Июнь 01, 2015, 00:31 »

Да нет, предлагаю свести к


                                                 [Server]
                                                      |
[                            передающий-принимающий поток                              ]
     |         |         |         |         |         |         |         |         |         |         |   
[client][client][client][client][client][client][client][client][client][client][client]

Хотя тут ещё вопрос о количестве и качестве клиентов возникает и нужны подробности об обмене - объемы, интенсивность.

В чём плюсы - фактически клиенты не будут знать ничего о том, как куда и в какой форме отправляются данные, вся прием передача в одном месте (т.е. логирование и отлов ошибок упрощается). Возможен контроль клиентов. Сколько упало, сколько подключено и далее. Эдакий шлюз.

В чем минусы - один поток обрабатывает все данные. Ошибки и прочая валят весь приём передачу (ошибки программиста Веселый). Т.е. все клиенты будут зависеть от его работы. Вот тут вопрос об объемах встаёт.

PS с другой стороны на очень быстрый обмен Qt не годится, Qt медленный по сути.

Есть ещё вариант когда каждый клиент имеет свой сокет. Т.е.


[                                                              Server                                                                      ]
                  |                   |                   |                   |                   |                   |                   |         
       [client-socket][client-socket][client-socket][client-socket][client-socket][client-socket][client-socket]

Плюсы - каждый клиент независим, нет проблем влияющих на соседние клиенты.

Минусы - Логирование затруднено. Отлов ошибок затруднён. Проблема с синхронизацией и обратной связью.


Но в любом случае оба варианта живут дышат и работают. Вам выбирать Улыбающийся

Я реализовал второй вариант )
Записан
Bepec
Гость
« Ответ #33 : Июнь 01, 2015, 00:40 »

Работает? Ну и ладненько. Темку прикройте Улыбающийся
Записан
Денис
Гость
« Ответ #34 : Июнь 01, 2015, 11:42 »

 Блин, не совсем сделал ... сделать то сделал, но опять в Ubuntu под консолью не работает:
Обработка нового клиента
Код:
/*
 * New client connection
 */
void SenseSystem::TechServer::incomingConnection(qintptr socketDescriptor)
{
    // If server started
    qDebug() << "New request to connect!!!!!";

    QTcpSocket *clientSocket = new QTcpSocket();
    socket.insert(socketDescriptor,clientSocket);

    // Trying to connect to socket descriptor
    if (!socket[socketDescriptor]->setSocketDescriptor(socketDescriptor))
    {
        // Can't connect to socket descriptor
        socket[socketDescriptor]->deleteLater();
        socket.remove(socketDescriptor);
    }
    else
    {
        // setup signal and slot
        connect(socket[socketDescriptor],SIGNAL(readyRead()),this,SLOT(socketReadClient()));
        // Initiolization settings for system
        QTimer *timerOut = new QTimer(this);
        autoriz.insert(socketDescriptor,timerOut);
        // setup signal and slot
        connect(autoriz[socketDescriptor],SIGNAL(timeout()),this,SLOT(autorizTimeout()));
        // Reading command from MySQL
        autoriz[socketDescriptor]->start(15000);
    }
}

Перемещаю
Код:
            QThread *thread = new QThread(this);
            clientSocket->moveToThread(thread);
            Client *client = new Client(clientSocket,sql,IDSystem);
            client->moveToThread(thread);
            // Соединяем сигнал started потока, со слотом process "рабочего" класса, т.е. начинается выполнение нужной работы.
            connect(thread,SIGNAL(started()),client,SLOT(process()));
            connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
            // По завершению выходим из потока, и удаляем рабочий класс
            connect(client,SIGNAL(finished()),thread,SLOT(quit()));
            connect(client,SIGNAL(finished()),client,SLOT(deleteLater()));
            // Starting the thread of socket to execute events
            connect(clientSocket,SIGNAL(readyRead()),client, SLOT(socketReadClient()));
            connect(clientSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),client, SLOT(clientChangeState()));
            connect(clientSocket,SIGNAL(error(QAbstractSocket::SocketError)),client, SLOT(socketErrorClient()));
            connect(clientSocket,SIGNAL(disconnected()),client, SLOT(socketRemoveClient()));
            // Удаляем поток, после выполнения операции
            if(config.typeView == CONSOLE)
            {
                connect(client,SIGNAL(println(QString)),((Console *)config.display),SLOT(outStream(QString)));
                connect(client,SIGNAL(addClientToList(qintptr)),((Console *)config.display),SLOT(addClientToList(qintptr)));
            }
            else if(config.typeView == WINDOW)
            {
                connect(client,SIGNAL(println(QString)),((MainWindow *)config.display),SLOT(outStream(QString)));
                connect(client,SIGNAL(addClientToList(qintptr)),((MainWindow *)config.display),SLOT(addClientToList(qintptr)));
            }
            connect(client,SIGNAL(removeClientFromList(qintptr)),this,SLOT(removeMap(qintptr)));

            SenseSystem::TechServer::client.insert(socketDescriptor,client);
            thread->start();

Опять теже грабли, под Виндой и консольный вариант работает, а в Ubuntu отправка данных с потока происходит, а вот приема данных нету НепонимающийНепонимающий
« Последнее редактирование: Июнь 01, 2015, 11:43 от Денис » Записан
Bepec
Гость
« Ответ #35 : Июнь 01, 2015, 11:50 »

Мы уже выяснили что всё работает) А что там у вас в коде - хто вас знает Улыбающийся
Записан
Денис
Гость
« Ответ #36 : Июнь 01, 2015, 12:07 »

Мы уже выяснили что всё работает) А что там у вас в коде - хто вас знает Улыбающийся

Да причем тут у меня в коде, код рабочий и работает как в консоли на Windows, так и в графике, не работает только в консоли ... !!!!!!

Вот у Old мой код работает и в консоли под ArchLinux, а у меня нет ... может Linux библиотека каких-то не хватает ?
Записан
Bepec
Гость
« Ответ #37 : Июнь 01, 2015, 12:31 »

И у меня всё работает. И у вас всё работает. Когда раздупляется.
Значит вы в коде его задупляете.

Да, хотел сказать, но подзабыл - минимально компилябельный пример, это пример в котором есть:
а) проблема.
б) ничего больше.

Сделайте такой проектик, без своих хитровыдуманных систем и потестируйте его в консольно-видовом режиме.

PS то, что не работает Qt в Ubuntu, больше похоже на фарс. Потому что из 10 используемых мною программ на убунту, 8 написано на Qt Веселый
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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