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

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

10.07.2012, 13:13. Показов 21260. Ответов 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
 Аватар для Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
10.07.2012, 14:13
C++ (Qt)
1
2
3
4
    memset(A,0,sizeof(A));
 
   i=reg.read(A,reg.bytesAvailable());
    g=g+i;
поменяй на
C++ (Qt)
1
2
3
 char buffer[1024]
   i=reg.readLine(buffer,sizeof(buffer));
    if(i !=-1){emit new_data(buffer)}
и отпишись о результатах =)

я твой код не переписывал, думаю понятно что к чему
0
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485
10.07.2012, 15:28  [ТС]
Спасибо.
Дело не в этом - я зню что посылку нужно собирать (она приходит порциями),
я просто ее не плюсую -но смотрю по g за всем размером. Дело в объявлении
сокета и связки слотов, наверное... -но как я пока не понял...

Визуальные компонеты формы и она сама тормозят все равно!
0
 Аватар для Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
10.07.2012, 15:51
собирал когда-то этот класс по запчастям из обрезков в угоду не помню чему, пробуйте, если не будет тормозить - нужно будет смотреть что в нем иначе

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
class ThreadSocket : public QThread
{
    Q_OBJECT
public:
    ThreadSocket(QString& iqstr_Address, int iint_Port, QObject* parent = 0);
    ~ThreadSocket();
private:
    bool mboo_Connected;
    QTcpSocket* mpqtcp_Socket;
    QString mqstr_Address;
    int mint_Port;
 
    QByteArray buffer;
 
signals:
    void Sign_RecMsg(QByteArray);
 
public slots:
    void run();
    void Disconnect();
    void SendUpdate(QByteArray iqstr);
private slots:
    void SocketConnected();
    void SocketAnswer();
    void SocketError(int iint_Error);
    void SocketClosed();
 
 
};

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
77
78
79
80
ThreadSocket::ThreadSocket(QString& iqstr_Address, int iint_Port, QObject* parent)
    :QThread(parent), mqstr_Address(iqstr_Address), mint_Port(iint_Port)
{
    i = 0;
    mboo_Connected = false;
}
 
ThreadSocket::~ThreadSocket()
{
    mpqtcp_Socket->close();
    delete mpqtcp_Socket;
}
 
void ThreadSocket::run()
{
    mpqtcp_Socket = new QTcpSocket(this);
    //mpqtcp_Socket->moveToThread(new QThread);
 
    connect (mpqtcp_Socket, SIGNAL (connected()), SLOT(SocketConnected()) );
    //connect (mpqtcp_Socket, SIGNAL (connectionClosed()), SLOT(SocketClosed()), Qt::DirectConnection );
    connect (mpqtcp_Socket, SIGNAL (disconnected()), SLOT(SocketClosed()));
 
    connect (mpqtcp_Socket, SIGNAL (readyRead()), SLOT(SocketAnswer()), Qt::DirectConnection);
    //connect (mpqtcp_Socket, SIGNAL (er(int)), SLOT(SocketError(int)) );
 
    mpqtcp_Socket->connectToHost (mqstr_Address, mint_Port);
 
 
    //exec();
}
 
void ThreadSocket::SendUpdate(QByteArray iqstr_SendLine)
{
    qint64 lqint_Ret;
    while (mboo_Connected == false) {
        msleep(100);
    }
    lqint_Ret = mpqtcp_Socket->write(iqstr_SendLine.data(), iqstr_SendLine.size());
 
    if (mpqtcp_Socket->waitForBytesWritten(1000)) {
        // aspetta la fine dell'invio stringa
    }
}
 
void ThreadSocket::SocketConnected()
{
    mboo_Connected = true;
}
 
void ThreadSocket::SocketAnswer()
{
    qint64 lqint_Length;
 
 
    char buffer[1024];
    while (mpqtcp_Socket->canReadLine()) {
 
        lqint_Length = mpqtcp_Socket->readLine(buffer, sizeof(buffer));
        if (lqint_Length != -1) {
            emit Sign_RecMsg(QByteArray(buffer));
        }
        strcpy(buffer, "");
    }
}
 
void ThreadSocket::SocketError(int iint_Error)
{
    int c = iint_Error;
}
 
void ThreadSocket::SocketClosed()
{
 
}
 
void ThreadSocket::Disconnect()
{
    mpqtcp_Socket->disconnectFromHost();
    mpqtcp_Socket->waitForDisconnected();
}
C++ (Qt)
1
2
3
4
    ThreadSocket* socket = new ThreadSocket(addr,1234);
    connect(this,SIGNAL(socketUp()),socket,SLOT(run()));
    connect(socket,SIGNAL(Sign_RecMsg(QByteArray)),this,SLOT(newData(QByteArray)));
    connect(this,SIGNAL(toWrite(QByteArray)),socket,SLOT(SendUpdate(QByteArray)));
Да, кстате, запустите сокет сигналом
1
Почетный модератор
 Аватар для Humanoid
11554 / 4349 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
10.07.2012, 16:11
Цитата Сообщение от _SASA_ Посмотреть сообщение
Вывел всю работу с сокетом в поток - но один черт подтормаживает!!!
Всё потому что ты создал класс потока, но запускаешь метод run() из основного потока. В main.cpp замени
C++ (Qt)
1
T.run();
на
C++ (Qt)
1
T.start();
В thread.cpp содержимое THREAD::start() перенеси в THREAD::run(), а THREAD::start() убери совсем и из cpp и из h.
В конце THREAD::run() замени start() на exec()

Но я так и не нашёл, где тут идёт работа с интерфейсом.
1
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485
10.07.2012, 16:44  [ТС]
А работы с интерфейсом и сборки посылки пока нет - зачем если и так тормозят пустые виджеты...



Сделал все по пунктам: отрабатывает только коннект - приложение не висит, но передачи данных нет

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTcpSocket(0x22e404), parent's thread is QThread(0x3e4f80), current thread is THREAD(0x22e3fc)
0
 Аватар для Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
10.07.2012, 17:08
код в студию. Где-то щупаете методы сокета не через сигнал/слот...
тююю создаете в потоке главного.. короче код
1
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485
10.07.2012, 17:53  [ТС]
В общем от той ошибки ушел - Drus -уже написал, а я сразу не понял ... , но только сейчас сделал...
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <QObject>
#include <QThread>
#include <QTcpSocket>
 
class THREAD : public QThread
{
    Q_OBJECT
public:
 THREAD(QObject *parent = 0);
~THREAD();
 
 void run();
 
 
public slots:
    void WRITE();
    void READ();
    void ERR();
    void SL_RUN();
signals:
    void RE_WRITE();
    void RE_START();
    void SG_RUN();
 
public:
 
    QTcpSocket reg;
    int i;
    int g;
 
    char A[6666];
 
private:
 bool quit;
};
 
#endif // THREAD_H
 
//===================================================
 
 
#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()
{
 
   // reg=new QTcpSocket(this);
 
    QObject::connect(this, SIGNAL(SG_RUN()),this, SLOT(SL_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()));       // случайное отключение 
 
    QObject::connect(this, SIGNAL(RE_START()), this, SLOT(ERR()));            // на случай ошибки
 
    emit SG_RUN();
 
    exec();
}
 
 
void THREAD::WRITE()
{
    reg.write("Hello!!!", 8);
    g=0;
    i=0;
}
 
void THREAD::READ()
{
    char  B[6666];
    memset(B,0,sizeof(B));
 
   i=reg.read(B,reg.bytesAvailable());
//qDebug() << i << endl;
   g=g+i;
 
   if( g>=6666)
   {
   Sleeper::msleep(500);
   emit RE_WRITE();
   }
 
/*   Так у меня будет работать сборка посылки == не по ReadLine
    if(i<0)
    {
    emit RE_START();
    }
    else if((i>=0)&&(g<6666))
    {
 
        memcpy(&A[g],B,i);
        g=g+i;
      //  qDebug() << i << endl;
 
        if( g==6666)
        {
        Sleeper::msleep(500);
        emit RE_WRITE();
        }
    }
    else
    {
    emit RE_START();
    }
*/
}
 
void THREAD::ERR()
{
    reg.close();
    Sleeper::msleep(3000);
    emit SG_RUN();
}
 
void THREAD::SL_RUN()
{
 
reg.connectToHost("192.168.50.50", 5000);
}
Все в очередной раз работает, но форма и виджеты на ней подвисают = потока нет...
Создавал сокет через new в run() -- не помогло. Как быть и что делать?
0
 Аватар для Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
11.07.2012, 14:56
вообще сейчас меня мысль посетила: "гуй и так в отдельном потоке живет"(если я не прав - можно и нужно ткнуть носом и куда следует).

у меня на планшете приложение тоже подвисает, но вовсе не от того что работает сокет или что-то происходит в ядре приложения. а от обилия альфоналажения и всего остального...

Есть ли у вас что-то процессорозатратное в гуе?

По идее в тот же run() только соответствующего класса можно вынести создание виджетов, тогда и основной поток подвисать не будет никогда.

Мне почему-то кажется что тут дело не в сокете. Возможно в вашем случае это не так, но все-таки спрошу: нет ли у вас каких-либо собственных классов которые где-либо вызывают функции напрямую, не через сигнал-слот?

то есть вызов определенный таким образом
C++ (Qt)
1
2
3
4
myPushButton::onClick(){
socket->write("send someone");
}
будет подвешивать гуй
0
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485
11.07.2012, 15:23  [ТС]
Нет, я создал пустую форму с лабелями и кнопочками
без навешенных на них "событиями". На головной ui нет ни сигналов
ни слотов = для чистоты эксперимента все убрал. В main после "ui".show()
запускаю свой "тред" типа и все. Но при попытке поперетаскивать и покнопать
или поразворачивать и посворачивать окно все подтормаживает, но данные
принимаются и запрашиваются e сервера нормально. Как работает сокет в треде?

Уже убрал вывод и на консоль: QDebug()<< A <<endl - тоже без толку!

Все эти примеры клиентов с чатами и тд - для малых посылок работают, а попробуй
затаймить их на повтор-все тормозить будут. В общем я не знаю, что пока сделать!
0
Почетный модератор
 Аватар для Humanoid
11554 / 4349 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
11.07.2012, 15:34
Цитата Сообщение от _SASA_ Посмотреть сообщение
Но при попытке поперетаскивать и покнопать
или поразворачивать и посворачивать окно все подтормаживает
Какая при этом загруженность процессора? Может, это вся система уже тормозить начинает? А если поток вообще не запускать, то нормально работает?
0
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485
11.07.2012, 15:56  [ТС]
Да, без запуска потока все отлично. Машина не старая - тормозит сам процесс и он один.
Без потока все нормально. Это все моя ошибка - я неправилно использую сигналы и слоты!
0
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485
19.07.2012, 15:23  [ТС]
Уже не знаю что делать...
Как заставить приложение работать в потоке c клиетским сокетом?
Сделал все по присланному примеру (только таймер в наследнике-треда добавил),

C++ (Qt)
1
2
3
4
5
6
ThreadSocket* socket = new ThreadSocket(addr,1234);
    connect(this,SIGNAL(socketUp()),socket,SLOT(run()));
    connect(socket,SIGNAL(Sign_RecMsg(QByteArray)),this,SLOT(newData(QByteArray)));
    connect(this,SIGNAL(toWrite(QByteArray)),socket,SLOT(SendUpdate(QByteArray)));
emit socketUp();
]
запускал и в конструкторе класса с формой и в методе класса - результат тот же
проект подтормаживает. Посылка небольшая (6666 байт) и сеть 100 мб... Что ж такое?

Добавлено через 32 минуты
C++ (Qt)
1
2
3
4
5
6
7
8
class Sleeper: public QThread
{
public:
    static void msleep(int ms)
    {
        QThread::msleep(ms);
    }
};
Если убрать таймаут, то все работает быстро - даже не заметно,
но мне нужно брать запрс по времени.
0
 Аватар для Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
20.07.2012, 13:55
сейчас нет времени соображать что именно там происходит, и как реализовано, но первая пришедшая мысль - определите таймер в составе сокета, точнее внутри того класса, который запускается в run(). и свяжите сигнал таймера timeout со слотом этого класса

C++ (Qt)
1
connect(&timer,SIFNAL(timeout()),this,SLOT(getData(){/*ваша реализация*/}));
1
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485
21.07.2012, 16:29  [ТС]
Спасибо !!!

Сегодня с утра уже тоже узнал про таймер, но таймер посадил в классе с формой,
тест не тормозил вроде...

А по поводу потоков - они у меня создавались , но тормозила визуализация.

Добавлено через 23 часа 13 минут
Здравствуйте, в очередной раз по теме возник принципиальный вопрос:

Два класса:
# класс c формой ui и кучей виджетов,
# класс потока с клиентским сокетом (рабочий).

ВОПРОС: В каком из них должен находиться QTimer (как лучше),
чтобы раз в пол-секунды слался запрос, получался ответ
и это все обрисовывалось на форме (через слоты и сигналы)?

Просто вдруг форма не успеет отрисоваться, а тут на тебе рисуй еще и заново...

Спасибо!
0
 Аватар для Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
23.07.2012, 11:09
ну по логике программирования гуй вообще не должен обладать ни какой логикой, тем более что-то знать о реализации низкоуровневых классов и т.д. Хотя, это смотря как реализовать... можно же и просто повешать таймер на слот getData...

Вот если подумать что форма начинает отрисовывать контент, а тут бац и новая информация - то наверно один фиг где находится таймер, решение в слоте гуя такое:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
где-то в заголовке и конструкторе класса
bool locker = false;
 
void paintData(){
if(locker){
return;
}
locker = true;
 
//некоторые действия над виджетами
 
locker = false;
}
То есть такое поведение в случае когда не надо отслеживать изменение данных и можно взять их без потерь позже - вполне логично.

Но вот если вам нужно сохранить все вновь приходящие данные и не потерять их - тогда нужно воспользоваться классом QMutex QMutexLocker, для создания очередей.

C++ (Qt)
1
2
3
4
5
6
7
//в заголовочном файле
QMutex locker;
 
void paintData(){
QMutexLocker(&lock);
//работа над виджетами
}
Мне сейчас кажется логичным в таком случае вообще использовать буфер по типу QByteArray если можно записать строкой, либо если данные уже осмысленные - QList

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//класс занимающийся обработкой(к примеру ваш UI)
//В заголовке
QList list;
 
 
void slotSaveData(someData){
list.append(someData)
}
 
//а вот теперь таймером из гуя можно получать эти данные
 
connect(&timer,timeout(),...,slotGetData());
 
 
void slotGetData(){
emit newData(list);
list.clear();
}
То есть в последней реализации вы в любом случае ничего не потеряете и сможете отрисовывать виджеты только когда вам понадобится, а не когда сокету будет угодно

Добавлено через 3 часа 56 минут
и счас вспомнил: Обязательно в теле сокета тоже пользуйтесь локерами, да вообще везде, где к функции обращаются разные потоки, а то граблей не избежать
1
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
23.07.2012, 12:09
в сути вопроса не разбирался, код в пол глаза посмотрел, ИМХО концепция заложена не верная, я бы порекомендовал сделать пул потоков (QThreadPool) и написать класс на база QRunable и делать обработку и непосредственно работу через пул потоков, имхо это более правильно было бы, хотя с другой стороны, если клиент будет соединятся с кучей серверов и сервера будут постоянны, тогда можно и через QThread-ы делать, хотя опять таки, те же Троллы не рекомендуют делать через наследование от QThread, а рекомендуют использовать moveToThread (хотя могу и ошибаться) в общем всунул и я свои 5 копеек
2
 Аватар для Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
23.07.2012, 12:32
пока что мне не довелось ни с чем вышеперечисленным поработать, иначе возможно был бы солидарен с вышеобозначенным имхо =)

Насчет наследования - абсолютно согласен, раз уж у меня так написано - так и запостил


QRunable


Пойду курить мануалы по данной вундервафле
1
23.07.2012, 13:37

Не по теме:

а я сам ни разу с этим не работал пока, но недавно умных докладов наслушался, вот и сам по умничать решил ;)

1
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485
24.07.2012, 10:18  [ТС]
В общем, Спасибо!!!

...Да, moveToThread() когда-то делал и не сделал - с сокетами навозился и "левыми"
предупреждениями (особенно с сигналами - не переносились). Сделал по-стариковки - наследника
QThread - сервер будет почти постоянно в сети... пока вроде бы нормально работает сейчас еще...

...Очистил гуй = сделал еще промежуточный класс с таймерами и обработкой информации с сокетов!
(спасибо - наставили на путь праведный)... Диспетчер разгребки еще тот получился и работает...

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

...QRunable - почитал, почитал, посмотрел ... да и забил... Это для маниаков, а не для людей:
(стремное автоделете) -(ничего не делал). Возможно, его в следующих версиях еще и
переделывать будут: http://doc-snapshot.qt-project... asics.html --- в QT5.0!

Удачи!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.07.2012, 10:18
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru