QThread::terminate()文档声明不鼓励通过调用此函数来终止线程.
在我的程序中,我需要在完成执行之前终止一个线程.线程正在执行一些繁重的计算,我希望用户有控制权来停止计算.
我怎么能这样做而不是打电话QThread::terminate()?
我有一个使用一个工作线程的简单应用程序。这个工作线程被启动并初始化下载管理器,它负责从网络下载文件。在我的主应用程序类中,我在 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) 我学习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没有运行?
我有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中消失
问候
我有以下课程。
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的构造函数中,我设置classX为this.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) 我正在编写一个带有按钮的应用程序来启动/停止工作线程(实现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 的事件循环”。
我创建了一个QThread类来运行另一个类中的函数,但是另一个类有一个指向QWidget(QwtPlot)的指针,我在应用程序输出中收到此消息:
QCoreApplication::sendPostedEvents: Cannot send posted events for objects in another thread
Run Code Online (Sandbox Code Playgroud)
我已经读过另一个QThreads无法与QWidgets一起使用的主题(UI小部件必须在主线程中),但我的应用程序中的输出似乎是正确的.
任何人都可以向我解释为什么会出现此消息?如果我按原样使用代码会发生什么?
注意:抱歉,我无法发布代码.
提前致谢
我用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的信号?
我最近开始使用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) 在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()任何地方显式删除?