我有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) 我已经开发了自己的混合流密码,对于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) 我想在主应用程序的单独线程中运行代码,因为我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()'没有对象"
谢谢 !
有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) 我正在使用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) 我有一个程序有3个线程.所有这些程序都从不同端口的以太网获取数据.3个线程的数据频率可能不同.但是必须同时处理所有传入的数据.
因此,如果一个数据来自一个线程,它必须等待其他数据到来.我怎么才能得到它?
我有一个简单的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) 我正在寻找答案,如果这两个函数之间有任何区别,除了第一个函数的常量:
QThread * QObject::thread() const
QThread * QThread::currentThread()
Run Code Online (Sandbox Code Playgroud) 我想知道有什么区别之间存在new QThread(this)以及new QThread()和这将如何使用时,影响我的代码的行为的QThread.