Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/111: Рейтинг темы: голосов - 111, средняя оценка - 4.68
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485

Многопоточный TCP client (QThread и QTcpSocket)

10.07.2012, 13:13. Показов 21541. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Вот в очередной раз столкнулся с проблемой...

Есть TCP сокет сервера (adress и port) - с которого раз в 0.5 сек
нужно брать данные = пусть 6666 байт и обрисовывать их на форме ui.

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

"thread.h"
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <QObject>
#include <QThread>
#include <QTcpSocket>
 
class THREAD : public QThread
{
    Q_OBJECT
public:
 THREAD(QObject *parent = 0);
~THREAD();
 
 void run();
 void start();
 
public slots:
    void WRITE();
    void READ();
    void ERR();
signals:
    void RE_WRITE();
   // void START();
 
public:
 
    QTcpSocket reg;
    int i;
    int g;
    char A[6666];
 
private:
 bool quit;
};
 
#endif // THREAD_H
"thread.cpp"
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "thread.h"
 
class Sleeper: public QThread
{
public:
    static void msleep(int ms)
    {
        QThread::msleep(ms);
    }
};
 
 
THREAD::THREAD(QObject *parent)
    : QThread(parent), quit(false)
{
}
 
THREAD::~THREAD()
{
 
    wait();
}
 
void THREAD::run()
{
 
 
    QObject::connect(&reg, SIGNAL(connected()),this, SLOT(WRITE())); // после подключения запрс
 
    QObject::connect(&reg, SIGNAL(readyRead()), this, SLOT(READ())); // считывание 
 
    QObject::connect(this, SIGNAL(RE_WRITE()), this, SLOT(WRITE())); // и опять запрос
 
    QObject::connect(&reg, SIGNAL(disconnected()), this, SLOT(ERR())); // при сбое переподключаемся
 
    start();
}
 
 
void THREAD::WRITE()
{
    reg.write("Hello!!!", 8);   // для запроса серверу нужно 8 байт отослать
    g=0;
    i=0;
}
 
void THREAD::READ()
{
 
    memset(A,0,sizeof(A));
 
   i=reg.read(A,reg.bytesAvailable());
    g=g+i;
//   qDebug() << g << endl;
//   qDebug() << i << endl;
 
    //
 
    if( g>=6666)
    {
        Sleeper::msleep(500);
        emit RE_WRITE();
    }
}
 
void THREAD::ERR()
{
    reg.close();
    Sleeper::msleep(3000);
    reg.connectToHost("192.168.50.50", 5000);
}
 
void THREAD::start()
{
    reg.connectToHost("192.168.50.50", 5000);
}
в main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
 QApplication a(argc, argv);
    Wind w;
    Wind.show();
    
THREAD T;
T.run();
 
    return a.exec();
Находил похожие вопросы - но проблемы те же...
Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.07.2012, 13:13
Ответы с готовыми решениями:

TCP сервер и QThread
Вопрос в том, нужно ли создавать для сервера отдельный поток? Или не нужно? Или это не важно? И какие могут возникнуть ошибки, если все...

Соединение tcp client и tcp server
accept(); bind(); connect(); listen(); socket(); Нужно расположить их в порядке в каком их вызывает (А) сервер (Б) клиент, чтобы...

[Исходник, пример, готовый] Client Server многопоточный + MySQL
Вступление: Сам очень много времени потратил на изучение и поиски в интернете на то что бы найти что то подобное, но даже близко не где не...

20
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485
31.07.2013, 19:16  [ТС]
Студворк — интернет-сервис помощи студентам
Здравствуйте! Новая проблема в моём проекте. Опять не знаю как быть!!!
Интересная вещь получилась: при этом моём работающем многопоточном
клиенте (4.8 Linux), если взять и резко отключить службу протокола TCP,
то всё как-бы виснет - я даже не знаю где сигнал сокета не отрабатывает,
или слот не выводит в консоль сообщение об ошибке, в остальном - норма.
C++ (Qt)
1
2
3
// стандартный набор ошибок отрабатывается правильно
connect (Socket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(prsl_SocketError(QAbstractSocket::SocketError))
// сообщение об ошибке появляется не сразу а после перезапуска службы!
А затем если снова включить службу, то появляется сообщение об ошибке
и проект реконнектится и снова работает как надо, но ведь время утеряно!
Вот и в следствии всего вышенаписанного , у меня появляются вопросы по
QTcpSocket или вообще по сокетам. В чём же разница между этими вещами:
Socket->close(); и Socket->disconnectFromHost(); и как мне нужно правильно
использовать waitForDisconnected() - каким образом подобрать этот интервал?
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.07.2013, 19:16
Помогаю со студенческими работами здесь

Многопоточный Client-Server. Через Thread или Task?
Здравствуйте. Сейчас встала задача вновь написать Client-Server TCP. Но у меня уже был печальный опыт когда ломились 1к+ конектов с...

TCP-client and TCP-Server
Добрый день. Нужен сервер. В моем случае это пример-примитив. Проблема. Если я в IP клиента указываю 192.168.1.3(Мой ПК), то сервер с...

Многопоточный TCP сервер
Привет всем. У меня есть задача написать клиент-серверное приложение, с определенными условиями. С сабжем я еще не работал, поэтому...

Многопоточный TCP сервер
Пытаюсь написать многопоточный сервер, для работы с БД. Цель в том, чтоб к серверу смогло подключиться сразу несколько пользователей и...

Многопоточный TCP сервер
Здравствуйте. Хочу реализовать САБЖ. Сделал сервер, слушающий порт, и передающий дискриптор входящего соединения потоку. В потоке создается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так? Да, всё верно. Я — искусственный интеллект. Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает. В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше. Перед запуском проверяем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru