找回密码
 立即注册
收起左侧

线程问题导致的问题,非常简单

1
回复
6066
查看
[复制链接]
累计签到:16 天
连续签到:1 天
来源: 2018-11-7 14:59:25 显示全部楼层 |阅读模式
1Qter豆
本帖最后由 rain_sky 于 2018-11-7 14:59 编辑

     当我使用多个线程,每个线程里面中都有把一个不同的QJson文件转成XML文件,转换的时间较长,当打开的json文件多于2个时, 程序很卡,并且打印出多个QPainter::begin: Paint device returned engine == 0, type: 3  直接异常结束。
    我的问题是有没有什么办法,可以快速让多个json文件转成xml文件,我是在主线程用QStringList jsonFileName = QFileDialog::getOpenFileNames()打开多个json文件, 根据文件打开的个数来for循环创建线程,在每个线程中转换json文件为xml文件。然后按键出现了显示问题,然后异常退出。

mainwidow.h文件
#define MAXSIZE 5
Work *workThread[MAXSIZE];

mainwidow.cpp文件
void MainWindow:n_OpenChangeBtn_clicked()
{
    QStringList jsonFileName = QFileDialog::getOpenFileNames(this, tr("打开Json文件"), "J:\\Desktop\\", "JSON files (*.json)" );
    qDebug()<<"---0-----, count of files ="<<jsonFileName.count();
    for(int i=0; i<jsonFileName.count(); i++)
    {
        QFile file(jsonFileName);
        QJsonParseError jsonError;
        QString fileName = jsonFileName;

        if(!fileName.isEmpty() && !fileName.isNull())//file->open(QIODevice::ReadOnly | QIODevice::Text)
        {
            if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
            {
                qDebug()<<tr("open %1 file failed!").arg(fileName);
                continue;
            }
            QByteArray data = file.readAll();
            file.close();

            QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);

            if(!jsonDoc.isNull()  && jsonError.error == QJsonParseError::NoError){

                workThread = new Work(jsonFileName, jsonDoc);

                qDebug()<<"123456";

            }else{
                qDebug()<<"jsonDoc is null or occur error!";
            }
        }else{
            qDebug()<<"fileName is empty or null!";
        }
    }
}

work.h文件
public:
    Work(QString jsfileName, QJsonDocument jsonDoc);
protected:
    void run();
private:
    QString jsfileName;
    QJsonDocument jsonDoc;
    QMutex mutex;

work.cpp文件
Work::Work(QString jsfileName, QJsonDocument jsonDoc)
{
    mutex.lock();
    this->jsfileName = jsfileName;
    this->jsonDoc = jsonDoc;

    start();
}
void Work::run()
{
   //转成xml函数,并保存在另一个文件中
    mutex.unlock();
}

回复

使用道具 举报

累计签到:16 天
连续签到:1 天
2018-11-7 14:59:26 显示全部楼层
mainwidow.h文件
#define MAXSIZE 5
Work *workThread[MAXSIZE];
mainwidow.cpp文件
void MainWindow:n_OpenChangeBtn_clicked()
{
    QStringList jsonFileName = QFileDialog::getOpenFileNames(this, tr("打开Json文件"), "J:\\Desktop\\", "JSON files (*.json)" );
    qDebug()<<"---0-----, count of files ="<<jsonFileName.count();
    for(int i=0; i<jsonFileName.count(); i++)
    {
        QFile file(jsonFileName[i]);
        QJsonParseError jsonError;
        QString fileName = jsonFileName[i];

        if(!fileName.isEmpty() && !fileName.isNull())//file->open(QIODevice::ReadOnly | QIODevice::Text)
        {
            if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
            {
                qDebug()<<tr("open %1 file failed!").arg(fileName);
                continue;
            }
            QByteArray data = file.readAll();
            file.close();

            QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);

            if(!jsonDoc.isNull()  && jsonError.error == QJsonParseError::NoError){

                workThread[i] = new Work(jsonFileName[i], jsonDoc);

                qDebug()<<"123456";

            }else{
                qDebug()<<"jsonDoc is null or occur error!";
            }
        }else{
            qDebug()<<"fileName is empty or null!";
        }
    }
}
work.h文件
public:
    Work(QString jsfileName, QJsonDocument jsonDoc);
protected:
    void run();
private:
    QString jsfileName;
    QJsonDocument jsonDoc;
    QMutex mutex;
work.cpp文件
Work::Work(QString jsfileName, QJsonDocument jsonDoc)
{
    mutex.lock();
    this->jsfileName = jsfileName;
    this->jsonDoc = jsonDoc;

    start();
}
void Work::run()
{
   //转成xml函数,并保存在另一个文件中
    mutex.unlock();
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了