Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2010, 22:20   #1
i-cpp
Пользователь
 
Регистрация: 05.12.2009
Сообщений: 33
Вопрос Qt, Threads, Sockets...

Я в Qt новичок. Подскажите где накосячил. Код компилется норм. Но если отправлять данные несколько раз подряд, подключение есть, а данные могут прийти, а могут и не прийти. Возможно нужно синхронизировать потоки, но я никак не соображу. Помогите, пжлст!!! Ниже частичная реализация thread.cpp и server.cpp:

server.cpp
Код:
#include <QtGui>
#include <QtNetwork>
#include "server.h"
#include "thread.h"
// ----------------------------------------------------------------------
void server::startServer(int nPORT)
{
    // создаем сервер и слушаем порт
    m_pTcpServer = new QTcpServer(this);
    m_pTcpServer->setMaxPendingConnections(100);
    if (!m_pTcpServer->listen(QHostAddress::Any, nPORT)) {
        m_pTerminal->append(QDateTime::currentDateTime().toString()
            + " : Server error <<" + m_pTcpServer->errorString() + ">>");
        m_pTcpServer->close();
        return;
    }
    // slotNewConnection() происходит при новом подключении к m_pTcpServer
    connect(m_pTcpServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
}
// ----------------------------------------------------------------------
void server::slotNewConnection()
{
    QTcpSocket* pClientSocket;
    pClientSocket = m_pTcpServer->nextPendingConnection(); // возращаем следующее подключение
    ClientThread *th = new ClientThread(*pClientSocket);
    connect(th, SIGNAL(finished()), th, SLOT(deleteLater()));
    connect(th, SIGNAL(finished()), this, SLOT(slotClientThreadFinished()));
    connect(th, SIGNAL(sendMsg(QString)), this, SLOT(slotRecvMsg(QString)));
    th->start();
    m_pTerminal->append(QDateTime::currentDateTime().toString()
        + " : connect from " + pClientSocket->peerAddress().toString());
}
// ----------------------------------------------------------------------
void server::slotClientThreadFinished()
{
    m_pTerminal->append(QDateTime::currentDateTime().toString()+" : client thread finished!");
}
// ----------------------------------------------------------------------
void server::slotRecvMsg(QString msg)
{
    m_pTerminal->append(QDateTime::currentDateTime().toString() + msg);
}
thread.cpp

Код:
#include "thread.h"
// ----------------------------------------------------------------------
ClientThread::ClientThread(QTcpSocket &pSocket)
{
    pClientSocket = &pSocket;
}
// ----------------------------------------------------------------------
void ClientThread::run()
{
    ui_t = QDateTime::currentDateTime().toTime_t(); // запомнить время подключения

    connect(pClientSocket, SIGNAL(disconnected()), pClientSocket, SLOT(deleteLater()));
    connect(pClientSocket, SIGNAL(disconnected()), this, SLOT(slotDisconnectClient()));
    connect(pClientSocket, SIGNAL(readyRead()), this, SLOT(slotReadClient()));

    exec();
}
// ----------------------------------------------------------------------
void ClientThread::slotReadClient()
{
    QByteArray block;
    block = pClientSocket->readAll();
    client_data += block;
}
// ----------------------------------------------------------------------
void ClientThread::slotDisconnectClient()
{
    emit sendMsg(client_data);
    emit finished();
}
i-cpp вне форума Ответить с цитированием
Старый 30.03.2010, 02:10   #2
i-cpp
Пользователь
 
Регистрация: 05.12.2009
Сообщений: 33
По умолчанию

почему-то данные считываются только из последнего подключения. Все потоки работают только с последним сокетом.

блокирую глобальные переменные mutex'ами не помогат; метод тыка не работает)

Последний раз редактировалось i-cpp; 30.03.2010 в 02:13.
i-cpp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
System.Net и System.Net.Sockets Adwenturer Общие вопросы .NET 4 08.02.2010 22:08
Posix Threads Ghevond20 Общие вопросы C/C++ 0 12.12.2009 01:31