QT有问题的多线程
Multi-threading in Qt problematic?
我已经学习了一段时间,几天前我决定通过QThread
进行多线程。我一直在关注这个人。因为他说子分类 QThread
不是适当的方法,而是使用 QObject
是。我正在遵循他的方法。但是他创建了另一个从QObject
继承的类。我决定进行一些更改:
class myclass
{
private:
dowork();
private slots:
slota();
slotb();
slotc();
}
myclass::dowork()
{
QThread lett;
QThread latt;
QThread pltt;
QObject lethread;
connect(&lett, SIGNAL(started()), this, SLOT(slota()));
lethread.moveToThread(&lett);
QObject lathread;
connect(&latt, SIGNAL(started()), this, SLOT(slotb()));
lathread.moveToThread(&latt);
QObject plthread;
connect(&pltt, SIGNAL(started()), this, SLOT(slotc()));
plthread.moveToThread(&pltt);
lett.start();
latt.start();
pltt.start();/*
lett.wait();
latt.wait();
pltt.wait();*/
while(lett.isRunning())
{
//qDebug() << "Still Running!";
}
lett.quit();
}
如果我运行了程序,它将继续运行while
循环无限!它根本没有出现。我在3个插槽的实现中使用了qdebug
来检查它是否正在输入它们,令人惊讶的是,没有一个插槽被调用。为什么会这样?如果我删除.wait
的评论,则该程序暂停。
这种方法有什么问题?我想避免那个额外的课程,因为我的程序很小。
while(lett.isRunning())
{
//qDebug() << "Still Running!";
}
lett.quit();
非常错误。当前的线程正忙着等待,并且会一直在吃饭。但这不是您的问题。您的问题当然是主事件循环可能尚未启动,即您还没有进行QApplication.exec()
。
QT使用事件来启动线程,当您使用movetoThread
,start
时,当前线程中排队(即执行这些方法的线程)。如果主要事件循环已经开始,则将尽快处理。但是在您的情况下,我敢打赌您的主要功能是:
int main(){
QApplication app();
myclass onlyclassIwanttomake;
onlyclassIwanttomake.dowork();
app.exec(); <----HERE!!!
}
当主线程执行app.exec();
时,该线程将启动。当您忙于等待时,您会阻止主线程处理启动您的事件事件。
编辑:嗯,另一个问题是
lett.start();
latt.start();
pltt.start();
启动启动的3个线程,并永远闲置。他们什么都没做,但是他们正在运行(即使您删除了循环)。
这是关于QT线程的文章。请花时间阅读它。
相关文章:
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- Vulkan默认情况下已经有多线程了吗
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- C++多线程生产者-消费者问题
- C++ 多线程中的锁和条件变量问题
- if 语句仅在前面有调试 cout 行(C 中的多线程)时才通过
- 多线程与线程小问题
- 多线程概念问题
- 在 Linux 中从单独的单线程进程生成多线程进程时出现问题
- 如何解决多线程绘图的问题不流畅
- C++ std::endl 的多线程程序 I/O 问题
- 我遇到了一个关于多线程的小问题.需要多线程来计算 Pi 和方差
- QT有问题的多线程
- C++-关于多线程的问题
- Borland C++-多线程TCPServer问题
- 有关 dup2 和多线程的问题
- 我的多线程应用程序使用Qt(错误SIGSEGV)有什么问题
- 多线程性能问题
- c++多线程参数问题
- c#到c++多线程,有什么问题吗?