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

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

10.07.2012, 13:13. Показов 21781. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru