Информация об изменениях

Сообщение Re[5]: Помогите с вопросом от 13.04.2024 16:19

Изменено 13.04.2024 16:23 Igore

Re[5]: Помогите с вопросом
Здравствуйте, milkpot, Вы писали:

M>QWaitCondition в функции doWork нужна была, потому что функция работала как аналог run'а.

M>Сейчас там нет QWaitCondition.

M>
M>class Worker2 : public QObject
M>{
M>    Q_OBJECT
M>public:
M>    QMutex mutex;
M>    QWaitCondition wtc_worker;
M>   // QPixmap pixmap_copy;
M>    bool wait_cnd;
M>    bool b_counter;
M>    bool c_variable=true;
M>    int data_quant=81920;
M>    quint16 package_num;
M>    quint16 str_num;
M>    int color_shift=0;
//Я надеюсь это от уменьшения примера, так то все эти переменные можно удалить

M>    void doStart()
//Тут код в 2 раза можно сократить

M>    void writeToUdp(const QByteArray& qBinArray)
//Я бы по разным классам сделал читателя и писателя. Или писатель тоже в отдельном потоке должен быть?

M>signals:
M>    void sendData(const QImage &image);

M>Window::Window()
M>{
M>    //---+
M>    connect(&worker, &Worker2::sendData, this, &Window::displayImage);
/*Я надеюсь там сохранение QImage в классе и вызов update
void Window::displayImage(const QImage &image)
{
    m_Image = image;
    update();
}
*/

M>Window::~Window()
M>{
M>   // m_Thread.wait();
M>    m_Thread.quit();
M>}
M>


M>В выводе приложения QtCreator'а после закрытия приложения появляются записи:

M>QThread: Destroyed while thread is still running
вызван m_Thread.quit();, но нет ожидания его завершения(waitForFinished), потом начинает работать ~Window и m_Thread просто уничтожается во время работы
M>QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
когда происходит m_Thread.quit(); начинается завершение потока, finished это уже потока нет, а в нем создан socket, который нужно удалить в том же потоке где он был создан

Ну в примере же по другому
m_Receiver.stop();
m_Thread.quit();
m_Thread.waitForFinished();
Re[5]: Помогите с вопросом
Здравствуйте, milkpot, Вы писали:

M>QWaitCondition в функции doWork нужна была, потому что функция работала как аналог run'а.

M>Сейчас там нет QWaitCondition.

M>
M>class Worker2 : public QObject
M>{
M>    Q_OBJECT
M>public:
M>    QMutex mutex;
M>    QWaitCondition wtc_worker;
M>   // QPixmap pixmap_copy;
M>    bool wait_cnd;
M>    bool b_counter;
M>    bool c_variable=true;
M>    int data_quant=81920;
M>    quint16 package_num;
M>    quint16 str_num;
M>    int color_shift=0;
//Я надеюсь это от уменьшения примера, так то все эти переменные можно удалить

M>    void doStart()
//Тут код в 2 раза можно сократить

M>    void writeToUdp(const QByteArray& qBinArray)
//Я бы по разным классам сделал читателя и писателя. Или писатель тоже в отдельном потоке должен быть?

M>signals:
M>    void sendData(const QImage &image);

M>Window::Window()
M>{
M>    //---+
M>    connect(&worker, &Worker2::sendData, this, &Window::displayImage);
/*Я надеюсь там сохранение QImage в классе и вызов update
void Window::displayImage(const QImage &image)
{
    m_Image = image;
    update();
}
*/

M>Window::~Window()
M>{
M>   // m_Thread.wait();
M>    m_Thread.quit();
M>}
M>


M>В выводе приложения QtCreator'а после закрытия приложения появляются записи:

M>QThread: Destroyed while thread is still running
вызван m_Thread.quit();, но нет ожидания его завершения(waitForFinished), потом начинает работать ~Window и m_Thread просто уничтожается во время работы
M>QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
когда происходит m_Thread.quit(); начинается завершение потока, finished это уже потока нет, а в нем создан socket, который нужно удалить в том же потоке где он был создан

Ну в примере же по другому
m_Receiver.stop(); // Ставим в очередь потока вызов doStop
m_Thread.quit();   // Завершаем поток
m_Thread.waitForFinished(); // Ждем когда отработает из очереди doStop и нормально завершим внутреннее состояние