• 5385阅读
  • 5回复

qt多线程怎么实现? [复制链接]

上一主题 下一主题
离线guanjinwei
 

只看楼主 倒序阅读 楼主  发表于: 2011-09-03
关键词: qt,线程,excel
我是一新手,最近写了一个简单的代码,功能是:打开2个exce表格,然后查找期中相同的内容,用QAxObject 实现的,但发现一个问题,当excel表格数据较多时就会要很长时间才能查找完,这时候gui界面机会失去相应,其实程序是运行的,但给人的感觉很不好。我觉得可以使用多线程来实现,但又不知道怎么做,网上看了很多介绍多线程的文章,但还是不懂。希望论坛里的朋友能帮帮忙。我把大概的代码写在下面:
头文件 widget.h
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QtGui>#include <QTextCodec>#include <qaxobject.h>namespace Ui {    class Widget;}class Widget : public QWidget{    Q_OBJECTpublic:    explicit Widget(QWidget *parent = 0);    ~Widget();private slots:    void on_openoneButton_clicked();    void on_opentwoButton_clicked();    void on_findButton_clicked();private:    Ui::Widget *ui;    QAxObject* excel;    QAxObject* workbooks;    QAxObject* newworkbook;    QAxObject* oneworkbook ;    QAxObject *twoworkbook ;    QAxObject* newworksheet ;    void openExcelOne();    void openExcelTwo();    void findExcelSameWord();};#endif // WIDGET_Hmain.cpp

#include <QtGui/QApplication>#include "widget.h"int main(int argc, char *argv[]){    QApplication a(argc, argv);    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());//支持中文显示    Widget w;    w.show();    return a.exec();}
widget.cpp
#include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent) :    QWidget(parent),    ui(new Ui::Widget){    ui->setupUi(this);    setMaximumSize(697,434);    setMinimumSize(697,434);    ui->findButton->setEnabled(false);    ui->onespinBox->setEnabled(false);    ui->twospinBox->setEnabled(false);    ui->progressBar->setValue(0);//进度条显示为0    ui->progressBar->hide();    QAxObject* excel = new QAxObject( "Excel.Application", this );    workbooks = excel->querySubObject( "Workbooks" );//获取excel的集合指针 QAxObject*}Widget::~Widget(){    delete ui;}
void Widget::openExcelOne()
{
   ..................//打开第一个excel
}

void Widget::openExcelTwo()
{
    ...............//打开第二个excel
}
void Widget::findExcelSameWord()
{
  ..................//查找相同的内容,就是这里最耗时间,有什么办法解决吗。。。。。
}
离线guanjinwei

只看该作者 1楼 发表于: 2011-09-03
前面的代码变乱了,我再发一下试试:
头文件 widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtGui>
#include <QTextCodec>
#include <qaxobject.h>

namespace Ui {
    class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_openoneButton_clicked();

    void on_opentwoButton_clicked();

    void on_findButton_clicked();

private:
    Ui::Widget *ui;


    QAxObject* excel;
    QAxObject* workbooks;
    QAxObject* newworkbook;
    QAxObject* oneworkbook ;
    QAxObject *twoworkbook ;
    QAxObject* newworksheet ;
    void openExcelOne();
    void openExcelTwo();
    void findExcelSameWord();
};




#endif // WIDGET_H
main.cpp

#include <QtGui/QApplication>
#include "widget.h"


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());//支持中文显示
    Widget w;
    w.show();
    return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setMaximumSize(697,434);
    setMinimumSize(697,434);
    ui->findButton->setEnabled(false);
    ui->onespinBox->setEnabled(false);
    ui->twospinBox->setEnabled(false);
    ui->progressBar->setValue(0);//进度条显示为0
    ui->progressBar->hide();
    QAxObject* excel = new QAxObject( "Excel.Application", this );
    workbooks = excel->querySubObject( "Workbooks" );//获取excel的集合指针 QAxObject*
}

Widget::~Widget()
{
    delete ui;
}
void Widget::openExcelOne()
{
   ..................//打开第一个excel
}

void Widget::openExcelTwo()
{
    ...............//打开第二个excel
}
void Widget::findExcelSameWord()
{
  ..................//查找相同的内容,就是这里最耗时间,有什么办法解决吗。。。。。
}
离线wxj120bw

只看该作者 2楼 发表于: 2011-09-03
回 1楼(guanjinwei) 的帖子
开启一个线程 将两个excel内容传给线程 线程的查找用正则来匹配 最后将结果传给界面
离线guanjinwei

只看该作者 3楼 发表于: 2011-09-03
回 2楼(wxj120bw) 的帖子
方法理解,但线程的代码怎么写。。真不会,以前没用过线程。能给个代码参考吗? 邮箱:348763100@qq.com
离线wxj120bw

只看该作者 4楼 发表于: 2011-09-03
回 3楼(guanjinwei) 的帖子
Examples\4.7\threads\semaphores 这是qt自带的线程的例子 可以参考下
离线e1212dison

只看该作者 5楼 发表于: 2011-09-04
写一个查询类,接口用查询slot/结果反馈signal,然后moveToThread()
快速回复
限100 字节
 
上一个 下一个