标签: qthread

如何在不重新启动应用程序的情况下将QTimer间隔设置为动态更改

我有QTimer的线程,我喜欢它能够动态更改其执行间隔而无需重新启动应用程序:这是QThread运行方法中的代码:

void myThread::run()
{
      QTimer timer1;
      connect(&timer1, SIGNAL(timeout()),
              this,SLOT(fire(),Qt::DirectConnection));

      qDebug() << "A::run() worker thread -- currentThread:" << currentThread();

      timer1.start(1000);

      QThread::exec();;
}
Run Code Online (Sandbox Code Playgroud)

timer qthread

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

从不同的线程更新QProgressbar

我已经开发了自己的混合流密码,对于GUI,我使用的是Qt.最初我是在单个线程上编写的,但它是一个流密码,当在大文件上运行时,GUI功能失调.所以我将加密/解密转移到单独的Qthread.为了显示进度,我在GUI上包含了一个标准的QProgressbar.但是当我运行文件I/O时,加密/解密工作完美但进度条没有正确更新.整个操作完成后,进度条突然从0%变为100%,表明在操作过程中没有机会更新.对于代码,我将完成的百分比从FileCrypto发送到主GUI线程到QProgressbar的setValue(int)插槽.由于它不起作用,我还尝试将一个int poitner发送到FileCrypto线程,同时用百分比更新指针并在GUI线程上使用QTimer在本地检查int值的值并更新进度条但仍然我得到了完全相同的结果.

这是我的代码:

FileCrypto类:

#include <QThread>
#include <QFile>
#include <PolyVernam.h>  //my algo header

class FileCrypto : public QThread
{
    Q_OBJECT

public:
    FileCrypto(QString, QString, int);
    bool stopIt;

protected:
    void run();

signals:
    void completed(int);
    void msg(QString);
    void pathMsg1(QString);
    void pathMsg2(QString);
    void keyMsg(QString);

private:
    QFile src, dest;
    QString tag;
    int mode;
    qint64 length;
    PolyVernam pv;
};
Run Code Online (Sandbox Code Playgroud)

代码:

#include <FileCrypto.h>

FileCrypto::FileCrypto(QString input, QString keyFile, int mode)
{
    stopIt = false;
    this->mode = mode;
    src.setFileName(input);

    if(mode == 1)
    {
        emit msg("Current Encryption/Decryption status: Encrypting file... …
Run Code Online (Sandbox Code Playgroud)

qt cryptography file qprogressbar qthread

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

运行一个新的线程Qt C++

我想在主应用程序的单独线程中运行代码,因为我hava创建了一些文件:

thread2.h

#ifndef THREAD2_H
#define THREAD2_H
#include <QThread>

class thread2 : public QThread
{
    Q_OBJECT

public:
    thread2();

protected:
    void run();

};

#endif // THREAD2_H
Run Code Online (Sandbox Code Playgroud)

thread2.cpp

#include "thread2.h"

thread2::thread2()
{
    //qDebug("dfd");
}
void thread2::run()
{
    int test = 0;
}
Run Code Online (Sandbox Code Playgroud)

并且主文件名为main.cpp

#include <QApplication>
#include <QThread>
#include "thread1.cpp"
#include "thread2.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    thread2::run();

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用......

Qt Creator告诉我:"无法调用成员函数'虚拟void thread2 :: run()'没有对象"

谢谢 !

c++ qt multithreading class qthread

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

QThread :: quit()会丢弃EventQueue中的所有事件吗?

main功能:

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    Worker w;
    QObject::connect(&w, SIGNAL(done()), &a, SLOT(quit()), Qt::QueuedConnection);
    w.start();

    int ret = a.exec();
    w.quit();
    w.wait();

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

而且有Worker定义:

class Worker : public QThread
{
    Q_OBJECT
public:
    Worker(QObject *parent=0);
protected:
    void run();
protected slots:
    void process_request();
private:
    int ttl;
    Messenger* messenger;
}

Worker::Worker(QObject * parent)
    :QThread(parent),
    ttl(5),
    messenger(new Messenger(this))
{
    moveToThread(this);
    connect(messenger, SIGNAL(new_message()), SLOT(process_request()), Qt::QueuedConnection);
}

void Worker::finish(){
  quit();
  messenger->disconnectFromNetwork();   
}

void Worker::run(){
  messenger->connectToNetwork("somewhere");
  exec();
  emit done(); …
Run Code Online (Sandbox Code Playgroud)

qt multithreading qthread

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

如何在使用QWaitCondition的QThread中使用QTimer?(pyside)

我正在使用pyside,但(我认为)是一个通用的Qt问题.

我知道QThread实现调用._exec()方法,所以我们应该在启动的QThread上有一个事件循环.这样我们就可以在那个线程上使用QTimer(我已经完成了这个并且它完美地工作).我的问题是当QWaitCondition也被使用时,我想要一个带有无限循环的"消费者"线程等待在QWaitCondition上通知(来自生产者).我遇到的问题是,使用此设计我不能在消费者线程中使用QTimer.

这是我试图解释的场景的片段:

from PySide import QtGui
from PySide import QtCore
import sys

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.button = QtGui.QPushButton(self)
        self.button.setText("Periodical")
        self.button.clicked.connect(self.periodical_call)

        self.thread = QtCore.QThread()
        self.worker = Worker()
        self.worker.moveToThread(self.thread)
        self.thread.started.connect(self.worker.loop)
        self.thread.start()

    def closeEvent(self, x):
        self.worker.stop()
        self.thread.quit()
        self.thread.wait()

    def periodical_call(self):
        self.worker.do_stuff("main window") # this works
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.do_stuff) # this also works
        self.timer.start(2000)

    def do_stuff(self):
        self.worker.do_stuff("timer main window")

class Worker(QtCore.QObject):
    def do_stuff_timer(self):
        do_stuff("timer worker")

    def do_stuff(self, origin):
        self.origin = origin
        self.wait.wakeOne()

    def stop(self):
        self._exit = True
        self.wait.wakeAll()

    def …
Run Code Online (Sandbox Code Playgroud)

python qt pyside qthread qtimer

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

qt中的线程同步

我有一个程序有3个线程.所有这些程序都从不同端口的以太网获取数据.3个线程的数据频率可能不同.但是必须同时处理所有传入的数据.

因此,如果一个数据来自一个线程,它必须等待其他数据到来.我怎么才能得到它?

c++ qt multithreading boost qthread

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

QThread更新UI状态栏?

我有一个简单的pyqt gui,它创建一个qthread来打开文件并读取一些信息.我想更新我gui的状态栏.通常,这将是我在状态栏上更新消息的函数调用:

class gui1(QtGui.QMainWindow):

    def __init__(self, parent=None):

        super(gui1, self).__init__(parent)
        self.statusBar().showMessage("hello world")
        ...
        # create thread here
        self.mythread = WorkThread(text)   # create instance and pass some text

        self.mythread.finished.connect(self.threadDone)   # signal emitted on finish of thread
        self.mythread.start()   # begin thread
Run Code Online (Sandbox Code Playgroud)

但是,更新线程内状态的调用不起作用.如何在qthread中更新gui的状态栏?

class WorkThread(QtCore.QThread):

    def __init__(self,text):  
        self.text = text
        QtCore.QThread.__init__(self)

    def __del__(self):
        self.wait()        

    def run(self):
        self.ui.statusBar().showMessage(status)   # WRONG SELF

        return  # must return, so that Qthread finished signal is emitted
Run Code Online (Sandbox Code Playgroud)

python qt multithreading pyqt qthread

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

QThread :: currentThread()vs QObject :: thread()

我正在寻找答案,如果这两个函数之间有任何区别,除了第一个函数的常量:

QThread * QObject::thread() const
QThread * QThread::currentThread()
Run Code Online (Sandbox Code Playgroud)

c++ qt multithreading qthread qobject

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

Qt,如何立即暂停QThread

我有一个QThread监听服务器.我想QThread立即暂停工作.不等待,但几乎像终止,它必须立即.

qt qthread

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

Qt-新QThread(this)和新QThread()有什么区别?

我想知道有什么区别之间存在new QThread(this)以及new QThread()和这将如何使用时,影响我的代码的行为的QThread.

c++ qt qthread

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

标签 统计

qthread ×10

qt ×9

multithreading ×5

c++ ×4

python ×2

boost ×1

class ×1

cryptography ×1

file ×1

pyqt ×1

pyside ×1

qobject ×1

qprogressbar ×1

qtimer ×1

timer ×1