Здравствуйте, SaZ, Вы писали:
SaZ>Подожду пока вы почините отладчик и всё-таки ответите на вопрос, касательно QWaitCondition — зачем он нужен? (есть чуйка, он не нужен). И покажите как вы потоки с воркерами стартуете?
SaZ>А пока попробуйте покопать в следующую сторону: инстансы всяких стримов, включая QUdpSocket не нужно создавать в конструкторе воркера. А то получается что вы их создаёте в одном потоке, а потом начинаете использоват в другом. Он типа должно работать после moveToThread, но по факту, именно со стримами, есть платформозависимые нюансы. Вообще ничего не делайте в конструкторах воркеров.
QWaitCondition в функции doWork нужна была, потому что функция работала как аналог run'а.
Сейчас там нет QWaitCondition.
class Worker2 : public QObject
{
Q_OBJECT
public:
QMutex mutex;
QWaitCondition wtc_worker;
// QPixmap pixmap_copy;
bool wait_cnd;
bool b_counter;
bool c_variable=true;
int data_quant=81920;
QByteArray another_qba;
QUdpSocket *socket;
quint16 package_num;
quint16 str_num;
int color_shift=0;
int i_counter=0;
void startStrm()
{
QMetaObject::invokeMethod(this, "doStart", Qt::QueuedConnection);
}
public slots:
void doStart()
{
another_qba.resize(2100000/*1228800*/);
socket=new QUdpSocket(this);
bool result;
QVariant value1;
value1=QVariant(2100000/*100000*/);
result=socket->bind( QHostAddress::AnyIPv4, 50012);
socket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption,value1);
value1=socket->socketOption(QAbstractSocket::ReceiveBufferSizeSocketOption);
connect(socket, &QUdpSocket::readyRead,this,&Worker2::readPendingDatagrams);
}
public:
void writeToUdp(const QByteArray& qBinArray)
{
quint16 port_large;
qint64 retData=0;
QString str;
port_large= 50012;
retData=socket->writeDatagram(qBinArray,QHostAddress::LocalHost, port_large);
}
public slots:
void doWork(const QString ¶meter) {
QString result;
bool booL_condition=true;
b_counter=false;
QByteArray byte_array;
QMutexLocker locker(&mutex);
while(booL_condition)
{
}
}
void readPendingDatagrams()
{
int size_of_data=0;
qint64 ret_value=0;
QByteArray buffer;
QString str;
while(socket->hasPendingDatagrams())
{
size_of_data=socket->pendingDatagramSize();
if(-1==size_of_data) continue;
buffer.resize( socket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
ret_value=socket->readDatagram(buffer.data(),buffer.size(),&sender,&senderPort);
if(-1==ret_value)
{
str=QString(tr("readDatagram failed"));
qDebug() << str;
continue;
}
writeData(buffer);
setUdpData(buffer);
}
}
public:
void setUdpData(const QByteArray& qba)
{
QString result;
int block=0;
quint8 kadr_num=qba.at(3);
quint16 str_num=MAKEWORD(qba.at(5),qba.at(4));
quint16 package_num=MAKEWORD(qba.at(7),qba.at(6));
int data_quant=307200;
for(int i=0;i<640;i++)
{
another_qba[i_counter]=qba.at(i+8);
i_counter++;
}
if(i_counter==data_quant)
{
prepare_generate_data();
i_counter=0;
}
return;
}
signals:
void resultReady(const QString &result);
void sendData(const QImage &image);
void writeUdpData(const QByteArray & );
};
class Window : public QWidget
{
Q_OBJECT
private:
Worker2 worker;
QThread m_Thread;
};
Старт рабочей нити
Window::Window()
{
//---+
worker.moveToThread( &m_Thread );
connect(&m_Thread, &QThread::finished, &worker, &QObject::deleteLater);
connect(&worker, &Worker2::resultReady, this, &Window::appendtoLogListBox);
connect(&worker, &Worker2::sendData, this, &Window::displayImage);
worker.startStrm();
m_Thread.start();
//----
}
Window::~Window()
{
// m_Thread.wait();
m_Thread.quit();
}
В выводе приложения QtCreator'а после закрытия приложения появляются записи:
QThread: Destroyed while thread is still running
QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread