Сообщение Re[5]: Помогите с вопросом от 13.04.2024 16:19
Изменено 13.04.2024 16:23 Igore
Re[5]: Помогите с вопросом
Здравствуйте, milkpot, Вы писали:
M>QWaitCondition в функции doWork нужна была, потому что функция работала как аналог run'а.
M>Сейчас там нет QWaitCondition.
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>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>В выводе приложения 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>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 и нормально завершим внутреннее состояние