Qt之主线程与子线程通信(linux下)

转载请注明出处:http://blog.csdn.net/feng1790291543 

主线程与子线程通信主要是通过Qt上的G
ui按钮,触发使得主线程上的信息发送到子线程中,并且时刻监测线程的运行情况

主线程,头文件:

#ifndef MANAGEWIDGET_H
#define MANAGEWIDGET_H

#include <QtGui/QWidget>
#include <QtCore>
//#include "childwidget.h"
//#include "simplethread.h"
//class ChildWidget;
class SimpleThread;

namespace Ui
{
    class ManageWidget;
}

class ManageWidget : public QWidget
{
    Q_OBJECT

public:
    ManageWidget(QWidget *parent = 0);
    ~ManageWidget();

private:
    Ui::ManageWidget *ui;
    //ChildWidget *child;
    QThread *child;
    SimpleThread *simple;

private slots:
    void on_pushButton_clicked();
    void on_pushButtonRunChild_clicked();
    void on_pushButtonSend_clicked();
    void StartReceive();
    void FinishReceive();

signals:
    void SignalChild(QString str);

};

#endif // MANAGEWIDGET_H

源文件:

#include "managewidget.h"
#include "ui_managewidget.h"
#include "childwidget.h"
#include "simplethread.h"

ManageWidget::ManageWidget(QWidget *parent)
    : QWidget(parent), ui(new Ui::ManageWidget)
{
    ui->setupUi(this);
    simple=new SimpleThread;
    //child=new ChildWidget;
    child=new QThread;
    connect(this,SIGNAL(SignalChild(QString)),simple,SLOT(print_str(QString)));
    connect(child,SIGNAL(started()),this,SLOT(StartReceive()));
    //connect(child,SIGNAL(finished()),this,SLOT(FinishReceive()));
}

ManageWidget::~ManageWidget()
{
    delete ui;
}

void ManageWidget::StartReceive()
{
    qDebug()<<"thread is starting!";
}

void ManageWidget::FinishReceive()
{
    qDebug()<<"thread is finishing!";
}

void ManageWidget::on_pushButtonSend_clicked()
{
    QString str=ui->lineEditContent->text();
    emit SignalChild(str);
    return ;
}

void ManageWidget::on_pushButtonRunChild_clicked()
{
    qDebug()<<"Main Thread Id is "<<QThread::currentThreadId();
    simple->moveToThread(child);
    child->start();
    return ;
}

void ManageWidget::on_pushButton_clicked()
{
    qDebug()<<"first isRuning---->"<<child->isRunning();
    qDebug()<<"first isFinishing---->"<<child->isFinished();
    child->quit();
    child->wait();
    qDebug()<<"second isRuning--->"<<child->isRunning();
    qDebug()<<"second isFinishing---->"<<child->isFinished();
    child->deleteLater();
    delete child;
}

子线程头文件:

#ifndef CHILDWIDGET_H
#define CHILDWIDGET_H

#include <QThread>
#include <QtCore>

class ChildWidget : public QThread
{
     Q_OBJECT
public:
    ChildWidget();
    void run();

};

#endif // CHILDWIDGET_H

子线程源代码:

#include "childwidget.h"

ChildWidget::ChildWidget()
{
}

void ChildWidget::run()
{
    QString str="hello zhangsan";
    qDebug()<<"子线程中的的run() is"<<str;
    exec();
    return ;
}

中间独立线程:

#ifndef SIMPLETHREAD_H
#define SIMPLETHREAD_H

#include <QObject>
#include <QtCore>

class SimpleThread : public QObject
{
     Q_OBJECT
public:
    SimpleThread();
private slots:
    void print_str(QString str);
};

#endif // SIMPLETHREAD_H

源代码:

#include "simplethread.h"

SimpleThread::SimpleThread()
{
}

void SimpleThread::print_str(QString str)
{
    qDebug()<<"Simple Thread is here..."<<str;
    return ;
}

运行效果:

Qt之主线程与子线程通信(linux下)

时间: 2024-10-13 11:27:58

Qt之主线程与子线程通信(linux下)的相关文章

Android 主线程和子线程通信问题

Android 现在不支持View在子线程中创建及调用其方法.如果要实现子线程内容更新之后,将结果及时反馈到主线程中,该如何出来呢? 可以在主线程中创建Handler来实现. 这样子线程的结果,可以通过发消息的形式,通知主线程,然后主线程中去及时更新View控件. Handler的使用方式: mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg);

Android主线程、子线程通信(Thread+handler)

Android是基于Java的,所以也分主线程,子线程! 主线程:实现业务逻辑.UI绘制更新.各子线程串连,类似于将军: 子线程:完成耗时(联网取数据.SD卡数据加载.后台长时间运行)操作,类似于小兵: 一.子线程向主线程发消息(Thread+handler): 1.主线程中定义Handler: Java代码   Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.h

Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息

之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: package cn.lixyz.handlertest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import andr

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主要研究Handler的消息发送. 包含主线程往子线程发送消息,子线程之间互相发送消息. 一.主线程向子线程发送消息. 实现过程比較简单: 主线程发送消息到异步线程.异步线程接收到消息后在再发送一条消息给主线程. 1. 初始化主线程的Handler,用来接收子线程的消息. 2. 启动异步线程.在异步线

Java实现主线程等待子线程

本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的CountDownLatch,是一个倒数计数器.初始化时先设置一个倒数计数初始值,每调用一次countDown()方法,倒数值减一,他的await()方法会阻塞当前进程,直到倒数至0. join方式代码如下: [java] view plain copy package com.test.thread

C#主线程等待子线程运行结束

佐左佑右 原文 C#主线程等待子线程运行结束 由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然后在主线程中弹出一个提示框,显示数据正在加载,等子线程运行结束后,主线程继续工作. 使用的是http://hi.baidu.com/oktell/item/5527f51d93abb4a5feded5a8中所提到的方法,用了这篇文章中的第一个方式,即不带参数的. 之后在其中加入了显示和关闭提示框的代

第一章、主线程与子线程

第一章.主线程与子线程 但我们打开FBReader程序的一刻,代码会立即创建一个子线程.之后,主线程会负责在屏幕上显示一个进度条,而子线程则在后台开始读取epub文件. PS:进度条的样子如下图所示,不过由于加载速度很快,这进度条都是一闪而过的.这张图片是在单步调试的环境下截取的. 在这一章,我们将详细介绍,程序如何创建子线程,以及如何控制进度条的显示与消失. 本章涉及的核心类是UIUtil类. FBReader默认首先进入的FBReader类,这是在AndroidManifes.xml设定的.

(转)C#/.NET主线程与子线程之间的关系

一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程. 有的博客上说“至少一个主线程”,这一说法持有怀疑         主线程与子线程之间的关系         **默认情况,在新开启一个子线程的时候,他是前台线程,只有,将线程的IsBackground属性设为true;他才是后台线程         *当子线程是前台线程,则主线程结束并不影响其他线程的执行,只有所有前台线程都结束,程序结束         *当子线程是后台线程,则主线程的结束,会导致子线程的强迫结

设置主线程等待子线程执行的方法

首先要注意的是: 1.java的Main线程结束之后,子线程还在运行.其实主线程已经退出了,但是JVM守护线程会等待所有的线程结束,才会退出.所以我们可以看到,子线程依然在继续执行. 2.那么如何实现主线程等待子线程的执行之后再结束,这个就要用到CountDownLatch,设置要执行的线程的个数,然后再子线程的run方法中调用countDown()的方法,递减线程的计数.在主线程结束之前,调用await()的方法,一直等待. 实现如下: public class Main extends Th