gpt4 book ai didi

c++ - 我的线程运行不正常,它给出了所有结果,最后不是一个一个地在一起,并且 GUI 在线程运行期间被挂起了吗?

转载 作者:行者123 更新时间:2023-11-30 03:43:50 25 4
gpt4 key购买 nike

我想在用户选择的特定位置按名称搜索文件。我一拿到文件就想要那个。它必须并行放置在 QTreeWidget 中,并在搜索过程中显示 QMovie(":/images/img_searching.gif"),直到用户没有停止搜索。

线程搜索.h

#ifndef QTHREADSEARCH_H
#define QTHREADSEARCH_H
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QFileInfoList>

class QThreadSearchFileName : public QThread
{
Q_OBJECT

public:
QThreadSearchFileName(QObject *parent = 0);
~QThreadSearchFileName();
void run();
void getAllfiles(QStringList, QDir);

signals:
void fileInfoList(QFileInfo);

private:
QMutex m_Mutex;
QWaitCondition m_WaitCondition;


};
#endif

线程搜索.cpp

#include "ThreadSearch.h"
#include <QApplication>
#include <QThread>



QThreadSearchFileName::QThreadSearchFileName(QObject *parent):QThread(parent)
{

}

QThreadSearchFileName::~QThreadSearchFileName()
{
m_WaitCondition.wakeOne();
wait();
}

void QThreadSearchFileName::run()
{
QMutexLocker locker(&m_Mutex);

}

void QThreadSearchFileName::getAllfiles(QStringList targetStrList, QDir currentdir)
{
for(long int i1=0; i1<targetStrList.size(); i1++)
{
QString targetStr;
targetStr = targetStrList[i1];
QDirIterator it(currentdir, QDirIterator::Subdirectories);
while (it.hasNext())
{
QString filename = it.next();
QFileInfo file(filename);

if (file.isDir())
{ // Check if it's a dir
continue;
}

if (file.fileName().contains(targetStr, Qt::CaseInsensitive))
{
emit fileInfoList(file);

}
}

}

}

main.cpp

#include <QCoreApplication>
#include <QDebug>
#include <QDirIterator>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QThreadSearchFileName *m_pSearchFileNameThread = new QThreadSearchFileName;
for(int i=0; i<userSelectedpathList.size(); i++)
{
QDir dir(userSelectedpathList[i]);
m_pSearchFileNameThread ->getAllfiles(stringListToBeSearch, dir);
connect(m_pSearchFileNameThread,SIGNAL(fileInfoList(QFileInfo)),this,SLOT(searchFileNameResult(QFileInfo)));
}

return a.exec();
}


void main::searchFileNameResult(QFileInfo file1) //Now Making SearchFile Name Tree
{
QTreeWidgetItem *SearchTreeItem = new QTreeWidgetItem(m_psearchProgresswdgt->finalSearchList_treeWidget);
SearchTreeItem->setCheckState(0,Qt::Unchecked);
SearchTreeItem->setText(1,file1.baseName());
}

最佳答案

将此类操作与 GUI 对象分开是一种很好的做法。更重要的是,我建议使用 QObject 提供的更高级别的异步机制:

  • 创建一些可以处理搜索的类,例如搜索类:

    class SearchingClass : public QObject {
    Q_OBJECT
    public:
    void setSomeSearchParametersOrSomething(QObject* something);
    public slots:
    void search();
    signals:
    void found(QObject* objectThatHasBeenFound);
    }
  • 创建此类的实例并将其移至另一个线程:

    auto searchingObject = new SearchingClass();
    searchingObject->setSomeSearchParametersOrSomething(...);
    auto thread = new QThread();
    searchingObject->moveToThread(thread);
    connect(this, SIGNAL(startSearchingSignal()), searchingObject, SLOT(search()));
    connect(searchingObject, SIGNAL(found(QObject*)), this, SLOT(someHandleFoundSlot(QObject*)));
    emit startSearchingSignal();
  • 确保每次搜索算法找到某个结果时都会发出found信号。

  • 当然,您必须在 GUI 类中实现 someHandleFoundSlot 并声明 startSearchingSignal 信号。

我假设您几乎不了解 Qt 框架,所以您应该阅读 signals and slots以及Qt meta-object system以充分理解整个代码。

编辑:我看到你已经编辑了你的问题。你的问题有几个解决方案,我会描述你,你做错了什么与我在这里发布的相比。

  1. 不要扩展QThread。改为扩展 QObject。它使您可以调用 moveToThread 方法。创建 QThread 实例并将其传递给此方法。它会导致稍后在您传递的线程中执行插槽。
  2. 不要在循环中建立相同的连接,除非您希望循环执行多次。
  3. 将方法 getAllfiles(或在我的示例中为 search)设置为 slot 并且不要手动调用它。当您手动调用方法时,它将总是在同一个线程中执行。只需将它连接到某个信号,然后发射那个信号。[就像找到匹配文件时发出信号一样——结果在插槽对象线程中处理。]
  4. 如果您想为每个 userSelectedpathList 元素设置线程,则由您决定。我建议您在一个工作线程中执行此操作(这是磁盘操作,我认为它不会更快)并在 getAllfiles 方法中迭代该列表。

关于c++ - 我的线程运行不正常,它给出了所有结果,最后不是一个一个地在一起,并且 GUI 在线程运行期间被挂起了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35861809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com