136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485

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

10.07.2012, 13:13. Показов 21656. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru