Форум программистов, компьютерный форум, киберфорум
Кроссплатфор­менная разработка
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251

Потоки отказываются обмениваться данными, в чем может быть дело?

06.07.2024, 19:08. Показов 8743. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть вот такой код
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
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "smartgraph.h"
#include "qthread.h"
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("Тестовое задание 1");
 
    ui->widget->xAxis->setRange(0,65535);
    ui->widget->yAxis->setRange(0,10);
 
    QPen pen = *new QPen(QColor(
        QRandomGenerator::global()->generate() % std::numeric_limits<byte>::max(),
        QRandomGenerator::global()->generate() % std::numeric_limits<byte>::max(),
        QRandomGenerator::global()->generate() % std::numeric_limits<byte>::max()));
 
    ui->widget->addGraph();
    ui->widget->graph(0)->setPen(pen);
 
    QThread *workerThread = new QThread(this);
    SmartGraph *a = new SmartGraph(0);
 
    QObject::connect(workerThread, &QThread::finished, a, &QObject::deleteLater,Qt::QueuedConnection);
    QObject::connect(this, &MainWindow::startLissen, a,&SmartGraph::beginLissen,Qt::QueuedConnection);
    QObject::connect(this, &MainWindow::stopLissen, a, &SmartGraph::stopLissen,Qt::QueuedConnection);
    QObject::connect(a, &SmartGraph::reCalculateGrapf, this, &MainWindow::updateGraphInfo,Qt::QueuedConnection);
 
    a->moveToThread(workerThread);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::updateGraphInfo(int grapfNumber, QVector<double> x, QVector<double> y)
{
    ui->widget->graph(grapfNumber)->addData(x,y);
    ui->widget->replot();
}
 
void MainWindow::on_pushButton_clicked()
{
    qDebug() << "Thread main " << this->thread()->currentThreadId();
    emit startLissen();
}
 
void MainWindow::on_pushButton_stop_clicked()
{
    emit stopLissen();
}
и такой класс

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
#include "smartgraph.h"
#include "qudpsocket.h"
#include "mainwindow.h"
#include <QDataStream>
 
SmartGraph::SmartGraph(int grapfNumber) : _grapfNumber(grapfNumber)
{
    //заполним данные оси Y
    x = *new QVector<double>(65535);
    y = *new QVector<double>(65535);
 
    for (int a = 0;a<65535;a++)
    {
        x[a] = a;
        y[a] = 0;
    }
 
    qDebug() << "Thread run " << this->thread()->currentThreadId();
 
    udpSocket = new QUdpSocket();
    QObject::connect(udpSocket,&QUdpSocket::readyRead,this,&SmartGraph::ReadingData);
}
 
void SmartGraph::beginLissen()
{
    qDebug() << "Thread zerro " << this->thread()->currentThreadId();
    udpSocket->bind(1111);
}
 
void SmartGraph::stopLissen()
{
    udpSocket->close();
}
 
void SmartGraph::ReadingData()
{
    QHostAddress sender;
    quint16 senderPort = 9999;
 
    while(udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());
        udpSocket->readDatagram(datagram.data(), datagram.size(),&sender,&senderPort);
        QDataStream in(&datagram, QIODevice::ReadOnly);
        uint16_t asseptedArray[64];
 
        for (uint16_t i = 0;i < 64;i++)
        {
            in >> asseptedArray[i];
        }
        this->recalculateArray(asseptedArray);
    }
}
 
void SmartGraph::recalculateArray(const uint16_t asseptedArray[])
{
    for (int i = 0;i < 64;i++)
    {
        y[asseptedArray[i]]++;
    }
 
    emit reCalculateGrapf (_grapfNumber, x,y);
}

Проблема, что если я напишу вот так, то все работает
C++ (Qt)
1
2
3
4
5
6
7
8
9
    QThread *workerThread = new QThread(this);
    SmartGraph *a = new SmartGraph(0);
 
    QObject::connect(workerThread, &QThread::finished, a, &QObject::deleteLater,Qt::QueuedConnection);
    QObject::connect(this, &MainWindow::startLissen, a,&SmartGraph::beginLissen,Qt::QueuedConnection);
    QObject::connect(this, &MainWindow::stopLissen, a, &SmartGraph::stopLissen,Qt::QueuedConnection);
    QObject::connect(a, &SmartGraph::reCalculateGrapf, this, &MainWindow::updateGraphInfo,Qt::QueuedConnection);
 
    //a->moveToThread(workerThread);  //нет многопоточки
а если вот так как написал ранее, то &SmartGraph::beginLissen не вызывается вообще, совсем, даже в консоль ничего не пишет.
Даже ошибки никакой нет, он просто не работает. Мне даже анализировать нечего.

В чем может быть дело?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.07.2024, 19:08
Ответы с готовыми решениями:

В чем может быть дело? Значение должно быть скаляром или вектором
Есть задание Проблема описана в теме

5 короткий сигналов биос, может ли дело быть в чем то другом чем в процессоре?
Комп врубается однако он никак не реагирует на мышь и клавиатуру, даже заходит во вход в Windows, но я не могу войти так как мышь и...

В чем может быть дело
Вот код move %userprofile%\desktop\1.txt c:\1.txt ЧТо бы переместить файл 1.txt по этому адресу, нужны права администратора.Запускаю...

4
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
06.07.2024, 19:42
Цитата Сообщение от Anton1978 Посмотреть сообщение
В чем может быть дело?
Поток "стартануть" забыли?
0
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
06.07.2024, 21:46  [ТС]
да, забыл.
прошу прощения, я этим с семи утра занимался, надо отдыхать

Добавлено через 11 минут
только теперь пишет другую ошибку при старте
Code
1
2
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QUdpSocket(0x38bcec0), parent's thread is QThread(0x21f8b80), current thread is QThread(0x38bce60)
Думаю лучше займусь этим завтра, но буду признателен за подсказки.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
06.07.2024, 22:01
Цитата Сообщение от Anton1978 Посмотреть сообщение
но буду признателен за подсказки
Сокет нужно создавать уже в потоке (в beginLissen, напр.) или аналогично перемещать в него (если сделать сокет дочерним для SmartGraph, то это будет сделано автоматически).
1
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
07.07.2024, 10:12  [ТС]
это действительно сработало, осталось понять почему при работе не происходит переключения между сокетами находящимися в разных потоках.
Идея была в том, чтобы мне отправлялось что-то рандомное по одному сокету, а слушали его разные сокеты в разных потоках. Естественно не одновременно, а чтобы прослушивание происходило только в момент работы потока, сокетом работающего в данный момент потока. Потеряются данные да и черт с ними, главное переключаться между сокетами и отмечать какой именно слушает (или уже принимает данные) сейчас.
Но судя по тому как это работает, прослушивание все равно происходит одним потоком или одним сокетом - они не меняются.

Добавлено через 22 минуты
кажется понял, в Qt все сокеты асинхронные, поэтому у меня какой сокет создался первым (считай в каком потоке запустился сокет) тот и будет продолжать считывать данные, пока я их всех сигналом stopLissen не отключаю. Так что реализация моя - плохая.
Или всё же можно что-то поменять ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.07.2024, 10:12
Помогаю со студенческими работами здесь

в чем может быть дело..
прикрепляю скрин и саму прогу там идет просто обмен сообщениями,запускаю 2 экземпляра,начинаю писать то в одном,то в другом,и через...

Не понимаю в чем может быть дело
Заказал чистый VPS, установил centos 7. Далее установил apache, файлы доступны по протоколу http. Вроде все отлично, но в ходе работы ...

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

Не подошел SSD M.2, в чем может быть дело?
Взял на ноутбук Dell Inspiron 3582 SSD M.2 R5M240G8. ...

Горят Мониторы! В чем может быть дело?
У родни стоял монитор ViewSonic Va703b, сначала стал периодически отключаться и пускать вертикальные волны по экрану. Никто значения не...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru