我有以下代码:
void Processmethod()
{
QDialog *ProcessMessage = new QDialog;
Ui::DialogProcessMessage Dialog;
Dialog.setupUi(ProcessMessage);
ProcessMessage->setModal(true);
ProcessMessage->setAttribute(Qt::WA_DeleteOnClose);
ProcessMessage->show();
qApp->processEvents();
processmethodONE();
processmethodTWO();
processmethodTHREE();
}
void processmethodONE()
{
QString ProcessCommand = "w8 " + blablubli";
Prozess.setWorkingDirectory(Path); //QProcess "Prozess" is globaly defined
Prozess.setStandardOutputFile(Path); //in my class
QThread* thread = new QThread;
Prozess.moveToThread(thread);
Prozess.start(ProcessCommand);
while(!Prozess.waitForFinished(2000))
{
std::cerr << "Process running " << std::endl;
}
QProcess::ExitStatus Status = Prozess.exitStatus();
if (Status == 0)
{
std::cout << "File created!" << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
在此源代码中,我尝试在某些进程启动之前打开一个弹出对话框。问题是对话框不可点击,但在对话框上我想创建一个按钮来中止正在运行的方法。如您所见,我尝试使用 QThread 在另一个线程中运行进程,但仍然无法单击该对话框。此外,如果我使用“application/x-executable”文件打开我的应用程序(GUI),则在激活上述方法时会丢失对话框内容。我该如何解决这些问题?我哪里错了?你好
从阅读这篇博客,这个博客和其他一些人,Subclassing QThread是不好的做法.所以我尝试应用这种方法.
但我的问题是我在类中有一个QTimer和一个QTcpSocket我想转移到另一个线程.突然间,它并不像使用的例子那么容易.:(
QThread m_commsThread;
m_pICommsHandler = new CommsHandlerIP();
m_pICommsHandler->moveToThread(&m_commsThread);
m_commsThread.start();
Run Code Online (Sandbox Code Playgroud)
这里是CommsHandlerIP类,不包括方法.
class CommsHandlerIP : public QObject
{
Q_OBJECT
public:
CommsHandlerIP();
~CommsHandlerIP(void);
protected:
QTcpSocket m_TCPSocket;
QTimer m_timer;
}
Run Code Online (Sandbox Code Playgroud)
问题是即使你移动CommsHandlerIP,QTimer和QTcpSocket(在CommsHandlerIP类内)也在主线程中.所以我无法启动计时器或连接插座.
如果我尝试moveToThread QTimer和QTcpSocket(在构造函数中通过传递线程指针),当我离开应用程序时,这变得非常混乱.
我该怎么办?
在这个简单的PyQt演示程序中,我从主线程发出信号.在工作线程中我连接到它们,但信号处理程序在主线程中运行:
from PyQt4 import QtGui, QtCore
import threading
from time import sleep
import sys
class Data():
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return "Data having %d and %d" % (self.a, self.b)
class Worker(QtCore.QThread):
def __init__(self, parent):
QtCore.QThread.__init__(self)
self.p = parent
def run(self):
self.connect(self.p, QtCore.SIGNAL("newTask"), self.task)
print "[%s] running exec_()" % threading.currentThread()
self.exec_()
def task(self, dataobj):
print "[%s] Processing" % threading.currentThread(), dataobj
sleep(3)
print "Done with", dataobj
self.emit(QtCore.SIGNAL("taskDone"), str(dataobj))
class App(QtCore.QObject):
def __init__(self):
QtCore.QObject.__init__(self)
self.w …Run Code Online (Sandbox Code Playgroud) 我是PyQT4的新手.我正在开发一个程序,我正在网上抓取数据到我的程序.在信息下载时,我的GUI锁定.我想在一个单独的后台线程中调用这个函数,也许使用QThread,但是我很难绕过QThread,Qt,以及插槽/信号通信方式.
我已经读过关于创建一个泛型工作线程,它将调用传递给它的任何函数.我不知道如何在我的主文件中实现它,以便我可以将我的函数作为后台进程运行.如果可以显示任何示例代码,请详细解释每一行,因为我不了解该过程.
我的ui是从Qt 4 Designer创建的外部文件中加载的.
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
Run Code Online (Sandbox Code Playgroud)
main.py(主文件)
def connections():
# If button is clicked, call summary(), which web scrapes
# for data. This could take 5-30 seconds, this freezes UI.
ui.btnRefreshSummary.clicked.connect(lambda: summary())
# Refresh items in gui
def refresh_ui():
if summary_data != []:
ui.valWatching.setText(summary_data[0])
ui.valBidding.setText(summary_data[1])
ui.valWon.setText(summary_data[2])
ui.valNotWon.setText(summary_data[3])
ui.valPurchases.setText(summary_data[4])
ui.valInvoices.setText(summary_data[5])
def login():
# Scrape website and login while in background;
# This locks up GUI until it completes.
# Pretend …Run Code Online (Sandbox Code Playgroud) 我解决了我的问题,通过移动
mySubQThreadrun()到myQThreadrun()也就是说,我仍然想知道为什么我之前尝试的方法不起作用。
我对线程很陌生。我遇到了这个问题,我想我可能正在处理错误的事情,无论如何。我对不同的方法持开放态度,我知道这可能有点令人费解。
我有一个 GUI 可以创建一个新的派生QThread让我们myQThread在该线程中调用它,我正在运行一个创建另一个线程的进程,调用它mySubQThread我遇到的问题如下,例如,我在 GUI 中定义了信号:signalA = QtCore.Signal(int)和一个插槽in 中myQThread的插槽mySubQThread似乎从未收到信号。
这是一个工作示例。(稍作修改)
from PySide import QtCore, QtGui
import time
class myQThread(QtCore.QThread):
myThreadSignal = QtCore.Signal(int)
def __init__(self, parent):
super(myQThread, self).__init__(parent=parent)
def run(self):
self.subThread = mySubQThread(parent=self)
self.myThreadSignal.connect(self.subThread.sub_thread_slot)
self.myThreadSignal.connect(self.test_slot)
print "starting subthread..."
self.subThread.start()
while self.subThread.isRunning():
print "myQThread is alive!"
time.sleep(1)
print "myQThread exiting run..."
@QtCore.Slot(int)
def my_thread_slot(self, a):
print "1b) Made it here!"
self.myThreadSignal.emit(a)
@QtCore.Slot(int)
def …Run Code Online (Sandbox Code Playgroud) 我有一个类,它是一些设备的抽象.
class Device
{
public:
...
void Start();
void Stop();
void MsgLoop();
signals:
void sMsgArrived();
}
Run Code Online (Sandbox Code Playgroud)
从GUI线程调用Start()和Stop().Start()开始运行MsgLoop()的新线程.它看起来像这样:
void MsgLoop()
{
forever {
if(SUCCESS == ReadMsg()) //synchronous, non-blocking
{
ProcessMsg(); //quite fast
emit sMsgArrived(); //this signal is connected with a slot in GUI thread
}
}
}
Run Code Online (Sandbox Code Playgroud)
当调用Stop()时,程序应该从MsgLoop()返回并停止该线程.如何在没有子类化的情况下使用QThread实现它?
class A : public QObject{
Q_OBJECT
signals:
void a_sig();
public:
A(){ }
public slots:
void begin(){
QObject::connect(&_timer, SIGNAL(timeout()), this, SIGNAL(a_sig()));
_timer.start(1000);
}
private:
QTimer _timer;
};
class B : public QObject{
Q_OBJECT
public:
B(){ value = 0; }
public slots:
void b_slot(){
++value;
QFile file("out.txt");
file.open(QIODevice::WriteOnly);
QTextStream out(&file);
out << value << "\n";
file.close();
}
private:
int value;
};
int main(int argc, char **argv){
QCoreApplication app(argc, argv);
A a;
B b;
QThread aThread;
QThread bThread;
QObject::connect(&aThread, SIGNAL(started()), &a, SLOT(begin()));
QObject::connect(&a, …Run Code Online (Sandbox Code Playgroud) 问题
我有一个PyQt GUI,用户按下按钮启动后台线程(workerThread从中进行子类化QThread).我想有一个计时器显示(以a的形式QLabel)来显示自workerThread启动以来已经过了多少时间,我希望这个计时器在workerThread退出后立即停止.
可能解决方案
我已经考虑过创建另一个独立的线程(timerThread),它使用a QTimer向一个槽发送一个信号来更新QLabel主GUI线程中的每1秒经过的时间.这timerThread会从收到终止信号后立即退出workerThread.
但是,我不得不开始timerThread在同一时间WorkerThread,我不知道怎么了这一点.
题
有更简单的方法吗?是QTimer甚至开始用正确的方法呢?
我正在研究用Qt 4.6开发的应用程序.
我想创建一个在单独的线程中计数的自定义计时器.但是,我希望这个计时器能够向主线程发送信号.
我将QThread子类化,但它似乎不起作用.
这是Timer.h:
#ifndef TIMER_H
#define TIMER_H
#include <QtCore/QObject>
#include <QtCore/QThread>
#include <QtCore/QTimer>
class Timer : public QThread
{
Q_OBJECT
public:
explicit Timer(QObject *parent = 0);
~Timer();
// true if the timer is active
bool isCounting();
// start the timer with a number of seconds
void startCounting(int value = 300);
void stopCounting();
// the number of seconds to reach
int maximum();
// the current value of the timer
int value();
// elapsed time since the timer has started …Run Code Online (Sandbox Code Playgroud) 我在Qt编写了一个线程,它做了很多事情(计算,数据采样......).
该线程必须以1000ms的间隔运行.
计时器允许的错误大约是5ms.
我已经改变了线程的优先级,QThread::HighPriority但是线程在大约1060ms-1100ms的间隔内运行.
如何使间隔更精确?(我已经将QThread子类化并msleep(interval)在run()方法中使用).