gpt4 book ai didi

c++ - 创建qt线程事件循环

转载 作者:可可西里 更新时间:2023-11-01 14:13:49 26 4
gpt4 key购买 nike

我正在使用 Qt 来编写 GUI 应用程序。

主线程负责 GUI 并创建 QThread 以便对对象执行一些操作。

class Worker
{
void start() {
QTimer* timer = new Timer();
connect(timer,SIGNAL(timeout()),this,SLOT(do()));
}

void do() {
//do some stuff
emit finished();
}
}



class GUI
{
//do some GUI work then call startWorker();

void startWorker() {
QThread* thread = new Thread();
Worker* worker = new Worker();

worker->moveToThread(thread);

connect(thread, SIGNAL(started()), worker, SLOT(start()));
connect(worker, SIGNAL(finished()), workerthread, SLOT(quit()));
connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
}
}

现在我有几个问题:

  1. 我的 worker 类中的计时器不工作。也许是因为 new thread has no event loop ,但我不知道如何创建这样的一个。我试过了

    connect(workerthread, SIGNAL(started()), workerthread, SLOT(exec()));

    但它也不起作用。

  2. 当我尝试在新线程上等待时,信号永远不会发送

    class GUI
    {
    void exit() {
    thread->wait();
    }
    }

我认为这也是因为没有事件循环,因此没有发出信号。

有人知道如何解决这些问题吗?

最佳答案

为什么不使用 qthreadpool,而不是让你的任务类继承自 qrunnable 和 qobject,这样你就可以使用信号和槽将数据从一个线程传递到另一个线程,实现起来更简单,并且由于不重新创建一个线程而提高了性能线程或一直在 sleep

class myTask : public QObject, public QRunnable{
Q_OBJECT

protected:
void run(); //where you actually implement what is supposed to do

signals:
void done(int data);//change int to whatever data type you need

}

//moc click example, or use a timer to call this function every x amount of time
void button_click(){
myTask *task = new myTask();
task->setAutoDelete(true);
connect(task,SIGNAL(done(int)),this,SLOT(after_done(int)),Qt::QueuedConnection);
QThreadPool::globalInstance()->start(task);
}

默认情况下你的应用程序自动获得 1 个线程,你可以用它来处理图形,而不是使用 qthreadpool 按需处理数据/对象,你甚至可以设置你的应用程序可以用来处理新的线程的最大数量请求,其他人将留在队列中,直到一个线程被释放

QThreadPool::globalInstance()->setMaxThreadCount(5);

关于c++ - 创建qt线程事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15774386/

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