标签: qthread

如何在新线程(QThread)中使用进程(QProcess)?

我有以下代码:

 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),则在激活上述方法时会丢失对话框内容。我该如何解决这些问题?我哪里错了?你好

c++ qt qprocess qdialog qthread

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

使用QThread和QTcpSocket正确使用QThread和moveToThread

从阅读这篇博客,这个博客和其他一些人,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(在构造函数中通过传递线程指针),当我离开应用程序时,这变得非常混乱.

我该怎么办?

c++ qt multithreading qthread

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

PyQt | 信号未在QThread中处理,但在主线程中处理

在这个简单的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)

pyqt qthread

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

在调用函数时如何防止GUI冻结?(PyQT4,Python3)

问题背景:

我是PyQT4的新手.我正在开发一个程序,我正在网上抓取数据到我的程序.在信息下载时,我的GUI锁定.我想在一个单独的后台线程中调用这个函数,也许使用QThread,但是我很难绕过QThread,Qt,以及插槽/信号通信方式.

我已经读过关于创建一个泛型工作线程,它将调用传递给它的任何函数.我不知道如何在我的主文件中实现它,以便我可以将我的函数作为后台进程运行.如果可以显示任何示例代码,请详细解释每一行,因为我不了解该过程.

问题:

  1. 如何在函数运行时阻止GUI冻结?
  2. 我如何使用后台线程来运行我的类中的函数?

码:

我的ui是从Qt 4 Designer创建的外部文件中加载的.

Github上的完整文件

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)

python user-interface multithreading pyqt4 qthread

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

PySide 将信号从 QThread 传递到另一个 QThread 中的插槽

我解决了我的问题,通过移动mySubQThread run()myQThread run()

也就是说,我仍然想知道为什么我之前尝试的方法不起作用。

我对线程很陌生。我遇到了这个问题,我想我可能正在处理错误的事情,无论如何。我对不同的方法持开放态度,我知道这可能有点令人费解。

我有一个 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)

python multithreading pyside qthread python-2.7

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

是否可以使用QThread实现轮询而不进行子类化?

我有一个类,它是一些设备的抽象.

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实现它?

c++ qt multithreading qthread

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

为什么信号/插槽无法使用多个线程?

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)

qt multithreading signals-slots qthread

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

关于GUI计时器的建议,以显示后台线程的已用时间?

问题

我有一个PyQt GUI,用户按下按钮启动后台线程(workerThread从中进行子类化QThread).我想有一个计时器显示(以a的形式QLabel)来显示自workerThread启动以来已经过了多少时间,我希望这个计时器在workerThread退出后立即停止.

可能解决方案

我已经考虑过创建另一个独立的线程(timerThread),它使用a QTimer向一个槽发送一个信号来更新QLabel主GUI线程中的每1秒经过的时间.这timerThread会从收到终止信号后立即退出workerThread.

但是,我不得不开始timerThread在同一时间WorkerThread,我不知道怎么了这一点.

有更简单的方法吗?是QTimer甚至开始用正确的方法呢?

python qt pyqt qthread qtimer

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

QThread和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)

c++ qt qthread qtimer

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

QThread中的精确间隔

我在Qt编写了一个线程,它做了很多事情(计算,数据采样......).
该线程必须以1000ms的间隔运行.
计时器允许的错误大约是5ms.
我已经改变了线程的优先级,QThread::HighPriority但是线程在大约1060ms-1100ms的间隔内运行.
如何使间隔更精确?(我已经将QThread子类化并msleep(interval)run()方法中使用).

c++ qt qthread

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