• 5715阅读
  • 6回复

QT线程的问题,希望达人给解决下,先拜谢了! [复制链接]

上一主题 下一主题
离线longle323
 

只看楼主 倒序阅读 楼主  发表于: 2008-07-14
— 本帖被 XChinux 执行加亮操作(2008-07-14) —
我写的一个线程,做用是调用别外一个人写的读取后台数据的接口!因为数据有时候会比较大,老板要求有个交互界面,可是读数据的部分不是我写的,进度条没法弄,SO,做了个QMESSAGEBOX写了个读取中,放在那,为了加快读的速度,用线程来做的,确实快了点,界面也不会在读的时候死掉,可是经常或者偶尔读完了反回信号的时候死在那个QMESSAGEBOX界面上(不同的电脑几率不同,貌似老CPU几率较大).
我是这样设计的 用户操作读取->给出读取中的QMESSAGEBOX->调用读的线程->读取成功->返回数据->关掉读取中的QMESSAGEBOX->显示数据
线程的代码如下:
class ThreadReadreport : public QThread      //用户定义的线程类
{
    Q_OBJECT
public:
    ThreadReadreport(RPT_FILE *rptfile,bool *read,QObject *parent = 0);
protected:
    void run();
private:
    RPT_FILE *rptfile;
    QMutex mutex;
    bool *read;
    QWaitCondition condition;
signals:
    void readdone(bool);

};
/******************************************************************************
*
* 报告读取的线程
*   
*    IN:
*        rptfile,要读的报告指针
*        read,判断是否读取成功的变量
*
*/
ThreadReadreport::ThreadReadreport(RPT_FILE *rptfile,bool *read,QObject *parent): QThread(parent)
{
    mutex.lock();
    this->rptfile = rptfile;
    this->read = read;
    mutex.unlock();
}
/******************************************************************************
*
* 报告读取线程的执行函数
*   
*
*/
void ThreadReadreport::run()
{
    mutex.lock();
    if(reportread(*rptfile))
    {
        *read = true;
        string loginfor;
        loginfor = "报告(" +  rptfile->name + ")读取";
        if(ERR == WriteLog(APP_REPORT_MGMT,OP_READ,USR_OP_STATE_FINISH,loginfor))
        {
        }
    }
    else
        *read = false;
    mutex.unlock();
}

调用部分的函数:
/******************************************************************************
*
* 打开读报告线程
*    IN:
*        rptname,报告名
*                    ALL:
*                                        test,QMessageBox;
*/
void Report_MainWindow::rptopen(QString rptname)
{
    test= new QMessageBox(this);
    test->setWindowTitle("读取报告");
    test->setIcon(QMessageBox::Information);
    test->setText("正在载入报告,这段时间可能较长,请稍候....");
    test->setStandardButtons(QMessageBox::NoButton);
    test->show();
   
    /*读取当前报告*/
    currentrpt.name = rptname.toLocal8Bit().data();
    QMutex mutex;
    ThreadReadreport *readrpt = new ThreadReadreport(¤trpt,&rptrs);
    readrpt->start();
    connect(readrpt,SIGNAL(finished()),this,SLOT(rptbuild()));
}
/******************************************************************************
*
* 读报告线程完毕打开报告
*   
*                  ALL:
*                                        test,QMessageBox;
*/
void Report_MainWindow::rptbuild()
{
    test->accept();
    if(rptrs)
    {
        detailsNo_show = -1;
        /*建立报告漏洞列表*/
        createvullist(currentrpt.report.reports[0],vulshowconfig);

        /*报告显示*/
        QString sum = Summary(currentrpt.report.reports[0],0);
        sum_textEdit->setHtml(sum);

        /*报告显示一系列控件控制*/
        Report_MainWindow::setWindowTitle(tr("%1 - %2").arg("报告").arg(currentrpt.name.c_str()));
        sum_groupBox->setHidden(true);
        col_groupBox->setHidden(true);
        sum_textEdit->setHidden(false);
        menucontrol(true);
    }
    else
        QMessageBox::critical(this,"错误信息","报告读取错误!");
}
界面偶尔会死在那个test的QMessageBox上不动,几率因机而异,实在是想破头也不知道怎么回事!谢谢达人们了
离线foxyz

只看该作者 1楼 发表于: 2008-07-14
try 一下QApplication::processEvent()
好像是这个函数
离线longle323

只看该作者 2楼 发表于: 2008-07-14
void QCoreApplication::processEvents ( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents )  [static]
void QCoreApplication::processEvents ( QEventLoop::ProcessEventsFlags flags, int maxtime )  [static]
没看懂这俩是怎么个意思 =.=
离线longle323

只看该作者 3楼 发表于: 2008-07-14
怎么用这个函数 放在哪啊..?
离线longle323

只看该作者 4楼 发表于: 2008-07-15
我把它加到程序的main函数里了 可是还是不行啊 还是会卡住!
离线lzian
只看该作者 5楼 发表于: 2008-07-15
test->reject(),试试看
离线longle323

只看该作者 6楼 发表于: 2008-07-15
谢谢帮忙 持续 关注中~~~ 这个吧 因为几率的问题不太好测出来这个毛病,改一次要一两天才会有结果 =.=
快速回复
限100 字节
 
上一个 下一个