QT多线程

来源:互联网 发布:非农数据软件 编辑:程序博客网 时间:2024/04/30 12:18

QT下多线程大概就是继承QThread这个类然后复写run()函数
下面是我写的一个QThread类。
其中包括子线程像主线程发送消息:
.h文件

#ifndef DY_SHOW_THREAD_H#define DY_SHOW_THREAD_H#include <QThread>class dy_show_thread:public QThread{     Q_OBJECTpublic:    dy_show_thread();    void setMessage(void* msg,QObject *parent = NULL);    void stop();protected:    void run();private:    void * msg;    volatile bool stopped; //volatile variable    QObject* window;};#endif // DY_SHOW_THREAD_H

cpp实现文件

#include "dy_show_thread.h"#include "dy_barrage_client.h"#include <unistd.h>#include "douyumainwindow.h"dy_show_thread::dy_show_thread(){    stopped = false;    msg = NULL;    window = NULL;}// zzzzvoid dy_show_thread::run(){    if(msg == NULL || window == NULL)        return ;    qDebug("msg and window in dy_show thread != NULL");    dy_barrage_client *dyc = (dy_barrage_client *)msg;    DouyuMainWindow* w = (DouyuMainWindow *)window;    QString name = "";    QString say = "";    while(!stopped)    {        //to do .        dyc->get_dy_server_msg(name,say);        //qDebug()<<name +"[in thread]:"+say;        if(name != "" || say != "")            QMetaObject::invokeMethod(w,"addLine",Q_ARG(QString,name),                                    Q_ARG(QString,say));    }}void dy_show_thread::setMessage(void *msg, QObject *parent){    this->msg = msg;    this->window = parent;}void dy_show_thread::stop(){    stopped = true;}

这里发送消息用到的是这个:

QMetaObject::invokeMethod(w,"addLine",Q_ARG(QString,name),                                    Q_ARG(QString,say));

w是主线程的句柄(大概叫这个意会)指针,第二个参数是调用的参数名字,有一个要求就是这个函数在主线程的那个类必须是个槽~ 对 就是个槽。 后面的就是参数了若干个参数按下面形式写即可

主线程的函数如下所示这里只列出函数:

public slots:    void addLine(QString name, QString say);

还有就是QT下 tableview自己滚动滚动条到最下面 ,用这个:

ui->tableView->scrollToBottom();

前面的指针需要换一下, 记住后面的参数就好。

0 0