gpt4 book ai didi

Qthread - 关闭线程时遇到问题

转载 作者:行者123 更新时间:2023-12-01 12:52:50 27 4
gpt4 key购买 nike

在过去的几天里,我一直在尝试使用 QThreads 而不对 QThread 进行子类化的新的首选方法。我遇到的麻烦是当我试图关闭我创建的一组线程时。我经常收到“线程仍在运行时已被销毁”消息(如果我在 Debug模式下运行,我还会收到“段错误”对话框)。我的代码非常简单,我尝试遵循我在 Internet 上找到的示例。

我的基本设置如下:我有一个简单的类,我想在一个单独的线程中运行;事实上,我想运行这个类的 5 个实例,每个都在一个单独的线程中。我有一个简单的对话框,其中包含一个用于启动每个线程的按钮和一个用于停止每个线程的按钮(10 个按钮)。当我单击其中一个“开始”按钮时,将创建测试类的一个新实例,创建一个新的 QThread,调用 movetothread 以将测试类对象获取到线程......另外,因为我有一对对于测试类中需要移动到线程的其他成员,我对这些其他项目额外调用了几次 movetothread。请注意,其中一项是 QUdpSocket,虽然这可能没有意义,但我想确保套接字可以以这种方式移动到单独的线程......我还没有测试套接字在线程在这一点上。

线程的启动似乎都工作正常。当我使用 linux top 命令查看线程是否已创建并正在运行时,它们按预期显示。

当我开始停止线程时出现问题。我随机(或看似随机)收到上述错误。

要在单独线程中运行的类:

// Declaration
class TestClass : public QObject
{
Q_OBJECT
public:
explicit TestClass(QObject *parent = 0);
QTimer m_workTimer;
QUdpSocket m_socket;

Q_SIGNALS:
void finished();

public Q_SLOTS:
void start();
void stop();
void doWork();

};

// Implementation
TestClass::TestClass(QObject *parent) :
QObject(parent)
{

}

void TestClass::start()
{
connect(&m_workTimer, SIGNAL(timeout()),this,SLOT(doWork()));
m_workTimer.start(50);
}

void TestClass::stop()
{
m_workTimer.stop();
emit finished();
}

void TestClass::doWork()
{
int j;
for(int i = 0; i<10000; i++)
{
j = i;
}
}

在我的主应用程序中,调用代码以启动第一个线程(每个其他线程都存在类似的代码):

mp_thread1 = new QThread();
mp_testClass1 = new TestClass();
mp_testClass1->moveToThread(mp_thread1);
mp_testClass1->m_socket.moveToThread(mp_thread1);
mp_testClass1->m_workTimer.moveToThread(mp_thread1);

connect(mp_thread1, SIGNAL(started()), mp_testClass1, SLOT(start()));
connect(mp_testClass1, SIGNAL(finished()), mp_thread1, SLOT(quit()));
connect(mp_testClass1, SIGNAL(finished()), mp_testClass1, SLOT(deleteLater()));
connect(mp_testClass1, SIGNAL(finished()), mp_thread1, SLOT(deleteLater()));
connect(this,SIGNAL(stop1()),mp_testClass1,SLOT(stop()));

mp_thread1->start();

同样在我的主应用程序中,当针对特定线程(在本例中为线程 1)单击停止按钮时调用此代码:

emit stop1();

有时看起来线程被停止和销毁没有问题。其他时候,我会收到上述错误。

任何指导将不胜感激。

谢谢,

布莱恩

最佳答案

http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

“最后,为了防止由于线程在删除时尚未完全关闭而导致的严重崩溃,我们将线程(而不是 worker!)的 finished() 连接到它自己的 deleteLater() 插槽。这将导致线程仅在完全关闭后才被删除。”

请尝试替换:

    connect(mp_testClass1, SIGNAL(finished()), mp_thread1, SLOT(deleteLater()));

与:

    connect(mp_thread1, SIGNAL(finished()), mp_thread1, SLOT(deleteLater()));

关于Qthread - 关闭线程时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11252978/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com