标签: qthread

如何终止QThread?

QThread::terminate()文档声明不鼓励通过调用此函数来终止线程.
在我的程序中,我需要在完成执行之前终止一个线程.线程正在执行一些繁重的计算,我希望用户有控制权来停止计算.
我怎么能这样做而不是打电话QThread::terminate()

c++ qt qthread

1
推荐指数
1
解决办法
2362
查看次数

如何告诉 QThread 等待工作完成,然后完成?

我有一个使用一个工作线程的简单应用程序。这个工作线程被启动并初始化下载管理器,它负责从网络下载文件。在我的主应用程序类中,我在 DownloadManager 完成之前发出的线程上有完成()信号。

我的问题是如何让工作线程等待 DownloadManager 完成其工作。

这是示例代码:

 class Main
 {
     m_DownloadWorker = new DownloadWorker(this);
     QObject::connect(pm_hotosDownloadWorker, SIGNAL(finished()), this, SLOT(DownloadWorkerFinished()));
     m_DownloadWorker->Execute();
     // do i need to do here something so the thread will wait ?

     .....


    void Main::DownloadWorkerFinished()
    {
        Log("DownloadWorkerFinished");
    }
 };


 class DownloadWorker : public QThread
 {
     void DownloadWorker::Execute()
     {

         // do i need to do here somthing so the thread will wait ? 
        start();
     }

     void DownloadWorker::run()
     {
         // do i need to do here somthing so the thread will …
Run Code Online (Sandbox Code Playgroud)

c++ qt4 qthread

1
推荐指数
1
解决办法
5746
查看次数

了解qthread何时完成

我学习Qthread.当qthread发出信号完成时我很困惑.退出运行功能时信号是否完成?

class TestThread(QtCore.QThread):
         customSignal = QtCore.pyqtSignal(['QString'])

         def __init__(self):
            QtCore.QThread.__init__(self)

         def run(self):
            print 'some code in run functions... '
            self.customSignal.emit('OK')
            print 'after this istruction qthread emit instantly finished signal?'
Run Code Online (Sandbox Code Playgroud)

在运行函数中,我发出被其他类拦截的自定义信号.在其他类中,我收到一个信号,我还检查Qthread是否为runnig:

     print 'TestThread is running? - ', self.myTestTh.isRunning()
Run Code Online (Sandbox Code Playgroud)

有时它打印真!因此,当退出运行功能时Qthread似乎没有立即完成所以,我是否可以拦截完成的信号以确保Qthread没有运行?

qt pyqt qthread

1
推荐指数
1
解决办法
3878
查看次数

如何在python中终止qthread

我有GUI应用程序使用qwebview通过长循环进行Web自动化过程所以我使用QThread来做这个,但我不能终止线程,我的代码在下面

class Main(QMainWindow):
    def btStart(self):
        self.mythread = BrowserThread()
        self.connect(self.mythread, SIGNAL('loop()'), self.campaign_loop, Qt.AutoConnection)
        self.mythread.start()

    def btStop(self):
        self.mythread.terminate()

    def campaign_loop(self):
        loop goes here

class BrowserThread(QThread):
    def __init__(self):
        QThread.__init__(self)

    def run(self):
        self.emit(SIGNAL('loop()'))
Run Code Online (Sandbox Code Playgroud)

这个代码在启动线程时工作正常但是无法停止循环并且浏览器仍在运行,即使我向它调用close事件并且它从GUI中消失

python terminate pyside qthread

1
推荐指数
1
解决办法
6225
查看次数

QObject::setParent:无法设置父级,新父级在不同的线程中

问候

我有以下课程。

class MyClass : public QObject
{
    Q_OBJECT

public:
    Q_INVOKABLE QVariant status();

public:
    MyClass(ClassX * classX);

public slots:
    void slotA();
    void slotB();

signals:
    void signalA();
    void signalB();

private:
    void init();
    void doSomething();

private:
    ClassX * classX;
    ClassA classA;
    ClassB classB;
};
Run Code Online (Sandbox Code Playgroud)

MyClass的构造函数中,我设置classXthis.classXand in init(),我将connect一些classX信号发送到MyClass插槽和 wise-versa 并在someFunction()我使用classAand 中classB

controller主线程的类中,我创建MyClass对象并在不同的线程中运行它。

MyClass * myClass = new MyClass(classX);
connect(&myClassThread, SIGNAL(started()), …
Run Code Online (Sandbox Code Playgroud)

c++ qt multithreading qtwebkit qthread

1
推荐指数
1
解决办法
2万
查看次数

如何退出工作线程 QThread 的事件循环

我正在编写一个带有按钮的应用程序来启动/停止工作线程(实现QThread)。工作线程每隔几毫秒就会持续调度一个作业。为了终止工作线程,我从 GUI 线程调用worker.quit()worker.exit(0)也不起作用)方法并等待finished信号被触发。

问题是即使finished信号被触发,线程也不会终止。

这是一个最小的例子:https : //gist.github.com/NawfelBgh/941babdc011f07aa4ab61570d7b88f08

最小示例的屏幕截图

编辑

我对发生的事情的解释是错误的:工作线程正在终止,但该方法iter正在主线程中执行,如@sergey-tachenov 所述,并从代码生成的日志中确认:

void run() {
    std::cout <<"From worker thread: "<<QThread::currentThreadId() << std::endl;
...
void iter() {
    std::cout <<"From thread: "<<QThread::currentThreadId() << std::endl;
...
void MainWindow::on_pushButton_clicked()
{
    std::cout <<"From main thread: "<<QThread::currentThreadId() << std::endl;
Run Code Online (Sandbox Code Playgroud)

我切换到不依赖于s的不同设计QTimer。但是我没有将其作为答案提交,因为这个问题的标题是“如何退出工作线程 QThread 的事件循环”。

c++ qt qthread

1
推荐指数
1
解决办法
1191
查看次数

无法为另一个线程中的对象发送已发布的事件 - Qt

我创建了一个QThread类来运行另一个类中的函数,但是另一个类有一个指向QWidget(QwtPlot)的指针,我在应用程序输出中收到此消息:

QCoreApplication::sendPostedEvents: Cannot send posted events for objects in another thread
Run Code Online (Sandbox Code Playgroud)

我已经读过另一个QThreads无法与QWidgets一起使用的主题(UI小部件必须在主线程中),但我的应用程序中的输出似乎是正确的.

任何人都可以向我解释为什么会出现此消息?如果我按原样使用代码会发生什么?

注意:抱歉,我无法发布代码.

提前致谢

c++ qt qwidget qthread

1
推荐指数
1
解决办法
1404
查看次数

如何在Qt中发信号通知另一个线程中的插槽

我用Qt编写了一个简单的信号槽应用程序.我想向另一个用完主线程的线程发送信号.

这是我的代码:

class Thread1 : public QThread
{
    Q_OBJECT


    void run()
    {
        exec();
    }
public:
    Thread1(QObject* parent);

public slots:
    void a()
    {
        qInfo()<<QThread::currentThreadId();
    }
};
class Object : public QObject
{
    Q_OBJECT
public:
    Object(){}
    void start()
    {
        qInfo()<<QThread::currentThreadId();
        Thread1* thread = new Thread1(this);
        connect(this,SIGNAL(a()),thread,SLOT(a()));
        thread->start();
        emit a();
    }

signals:
    void a();
};
Run Code Online (Sandbox Code Playgroud)

但它返回:

0x7f9851c988c0
0x7f9851c988c0
Run Code Online (Sandbox Code Playgroud)

如何调用输出另一个threadID的信号?

c++ qt multithreading signals-slots qthread

1
推荐指数
1
解决办法
4341
查看次数

Qt阻止了事件循环

我最近开始使用QT框架.昨天我开始编写一个简单的多线程应用程序.目前我有点坚持以下问题.

考虑两个工作类,它们都使用线程来进行一些"繁重的计算".第一个类FooWorker如下所示:

class FooWorker : public QObject
{
    Q_OBJECT

public:
    FooWorker() : QObject() { }
    ~FooWorker() { }

signals:
    void notify(int);
    void aborted();

public slots:
    void doWork()
    {
        int counter = 0;
        forever {

            // For the sake of this example this reassembles a heavy computational process
            if(counter++ < 10) {
                emit notify(counter);
                QThread::sleep(1);
            } else {
                counter = 0;

                // Wait until we get a signal to restart the process
                mutex_.lock();
                condition_.wait(&mutex_);
                mutex_.unlock();
            }
            // We should check for …
Run Code Online (Sandbox Code Playgroud)

c++ qt multithreading qthread

1
推荐指数
1
解决办法
2348
查看次数

QObject::moveToThread 中的移动语义

QThread 类的文档中,一个示例设置的工作方式如下:

public:
Controller() {
    Worker *worker = new Worker;
    worker->moveToThread(&workerThread);
    //some connects to thread and worker
    workerThread.start();
}
~Controller() {
    workerThread.quit();
    workerThread.wait();
}
Run Code Online (Sandbox Code Playgroud)

Qt 是否使用moveToThread(...)此处的函数实现了实际的移动语义?即线程是否会在完成后重新分配 Worker 对象,因为分配的对象永远不会Worker*Controller()任何地方显式删除?

c++ qt ownership-semantics qthread

1
推荐指数
1
解决办法
804
查看次数