如何在Qt中重新启动线程
How to relaunch a thread in Qt?
我使用一个单独的线程进行串口通信。这个线程应该在我们想要连接串行端口时启动,并在出现错误/断开连接时完成。
问题是,如果线程已经完成了一次,它不会重新启动下一次我们想要重新连接。
SerialIO::SerialIO(SettingsDialog *settings) : //Worker. Extends QObject
settings(settings)
{
serial = new QSerialPort(this);
}
SerialIO::~SerialIO()
{
serial->close();
//something else?
}
/* PUBLIC SLOT */
void SerialIO::connectSP()
{
/* connects with some port, if not succesfull, emits an error signal */
}
MainWindow::MainWindow(QWidget *parent)
: QWidget(parent)
{
//...
serialio = new SerialIO(settings);
serialio->moveToThread(&thread);
QObject::connect(&thread,SIGNAL(started()),serialio,SLOT(connectSP()));
QObject::connect(&thread,SIGNAL(finished()),serialio,SLOT(deleteLater()));
QObject::connect(serialio,SIGNAL(error(const QString)),this,SLOT(handleError(const QString&)));
//...
}
void MainWindow::connect()
{
if(!thread.isRunning()){
thread.start();
}
}
void MainWindow::handleError(const QString &msg){
QMessageBox::information(this, "Error", msg);
if(thread.isRunning()){
thread.quit();
thread.wait();
}
}
似乎线程没有正确完成,但我已经检查了线程没有运行!然后程序意外结束。
解决方案:
QObject::connect(&thread,SIGNAL(started()),serialio,SLOT(connectSP()));
QObject::connect(&thread,SIGNAL(finished()),serialio,SLOT(disconnectSP()));
QObject::connect(serialio,SIGNAL(bye()),&thread,SLOT(quit()));
deleteLater()
将事件发送到事件队列(如重绘事件,计时器事件或网络事件)。如果事件被处理,它将删除对象。如果没有事件循环,对象不会被删除。
你先退出线程,导致你的对象不被检测,因此你的析构函数不会被调用。
您应该将线程的finished()
信号连接到插槽以断开连接:
QObject::connect(&thread,SIGNAL(finished()),serialio,SLOT(disconnectSP()));
void SerialIO::disconnectSP()
{
serial->close();
}
也没有必要调用deleteLater()
,因为你只更新一次对象。
相关文章:
- 使用 std::string () const 函数启动线程或未来
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 使用 std::thread & std::bind 在成员函数中启动线程
- GDB 输出启动线程,但给出输出
- 尝试在我的基类中启动线程时,Visual Studio 由于调试错误而中止我的程序
- 启动线程会导致指针初始化时出现分段错误
- OMP 不启动线程
- 在关闭时升级登录中的启动线程访问违规
- 如何在dllmain中启动线程
- 如何使用媒体基础在给定时间运行/启动线程
- 如何在另一个核心上启动线程而不将处理器亲和力设置为特定核心
- Qt多线程启动线程错误
- 在构造函数中使用"this"启动线程是安全的?
- 停止,然后启动线程
- C++/Win32 我在 Windows 2000+ 上启动线程的最佳方式
- 如何在事件发生时启动线程并严格关闭其句柄
- 从 Poco::HTTPServer 启动线程
- 在成员函数上启动线程时不需要的析构函数调用
- 在c++中启动、停止和重新启动线程时的问题
- 如何在Qt中重新启动线程