在QThread

时间:2018-07-13 13:44:59

标签: c++ multithreading qt

我正在开发一个应用程序,该应用程序分析二进制文件列表并将结果保存到数据库中。文件的处理需要相当长的时间。因此,我向用户显示一个进度条和一个已处理文件的列表。成功处理文件后,我要更新进程栏。如果用户中止处理(即单击窗口的“ x”->&ParseAssistant :: rejected),则需要终止线程并删除分配的对象(即PluginWorker *和QThread *)。

/* mainwindow.cpp */

ParseAssistant parseWindow(files.size());

QThread* thread = new QThread();
PluginWorker* worker = new PluginWorker(pluginConnector, pluginProcessor, files);
worker->moveToThread(thread);

// Update GUI (progressbar + filelist)
connect(worker, &PluginWorker::updateProgress, &parseWindow, &ParseAssistant::updateProgress);

connect(thread, SIGNAL (started()), worker, SLOT (process()));
connect(worker, SIGNAL (finished()), thread, SLOT (quit()));
connect(thread, SIGNAL (finished()), thread, SLOT (deleteLater()));
connect(worker, SIGNAL (finished()), worker, SLOT (deleteLater()));

// Stop PluginWorker on 'x'-click
connect(&parseWindow, &ParseAssistant::rejected, worker, &PluginWorker::stop);
connect(worker, &PluginWorker::finished, &parseWindow, &ParseAssistant::parsingFinished);

thread->start();

parseWindow.exec();

首先,我正在创建一个QDialog(ParseAssistant),其中包含进度条和已处理文件的列表。然后,我创建一个工作线程对并按照'How To Really, Truly Use QThreads'中的描述绑定它们。 “ pluginConnector”有权访问插件并解析文件; pluginProcessor将结果写入数据库。

/* pluginworker.cpp */

PluginWorker::PluginWorker(PluginConnector& pc, PluginProcessor& processor, QStringList list)
{
    connect(this, SIGNAL(parseNext(int)), this, SLOT(process(int)));
}

// Called on 'x'-press
void PluginWorker::stop()
{
    isStopped = true;
}

void PluginWorker::process(int idx)
{
    if (isStopped) {
        emit finished();
        return;
    }

    if (0 <= idx && idx < files.length()) {
        /* 
         *  Parse file using PluginConnector and 
         *  use result with PluginProcessor
         */

        emit updateProgress(idx+1, error, source);
        emit parseNext(idx+1);
    } else {
        emit finished();
    }
}

我使用信号/插槽来调用parseNext,因为这允许Qt调用stop()(当收到&ParseAssistant :: rejected信号时)。另一种选择是遍历文件并调用QCoreApplication :: processEvents处理信号。

该构造大部分可用,但是当我使用'x'中止该进程时会崩溃。我无法准确找到导致应用程序崩溃的原因,但是我可以肯定我的方法存在缺陷,因为“工人”和“ pluginConnector / pluginProcessor”位于不同的线程中,但是我不知道如何正确处理用这个。

0 个答案:

没有答案