Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2016, 09:36   #81
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А разве paths уже заполнен в этот момент?
переделал, все работает. Но не могу понять почему когда другой раз нажимаю старт , оно выводит названия по два раза (cм. скрин)
я же делаю
Код:
 mFoundFilesList->clear();
на начале
Код:
void FindFilesWidget::startClicked()
{
    if (mActionState == ActionState::STOPPED)
    {
        mFoundFilesList->clear();
Код:
QGroupBox* FindFilesWidget::createFoundFilesGroup()
{
    QGroupBox* foundFilesGroup = new QGroupBox("&Found files:");
    mFoundFilesList = new QListWidget(foundFilesGroup);

    QHBoxLayout* hLayout = new QHBoxLayout();
    hLayout->setSpacing(6);
    hLayout->setContentsMargins(11, 11, 11, 11);
    hLayout->addWidget(mFoundFilesList);

    foundFilesGroup->setLayout(hLayout);
    return foundFilesGroup;
}
Изображения
Тип файла: png Untitled.png (9.8 Кб, 49 просмотров)
stasJun вне форума Ответить с цитированием
Старый 24.10.2016, 09:47   #82
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А выводите-то как?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.10.2016, 09:54   #83
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А выводите-то как?
если я Вас правильно понял:
Код:
void FindFilesWidget::fileFound(const QString& fileName)
{
    mFoundFilesList->addItem(fileName);
}
stasJun вне форума Ответить с цитированием
Старый 24.10.2016, 09:58   #84
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А как потоки создаются? Может быть всегда используются одни и те же экземпляры, и если подписка на сигналы происходит в Start, то они будут подписаны 2 (3, 4, ...) раза при повторном запуске.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.10.2016, 10:01   #85
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А как потоки создаются? Может быть всегда используются одни и те же экземпляры, и если подписка на сигналы происходит в Start, то они будут подписаны 2 (3, 4, ...) раза при повторном запуске.
Код:
void FindFilesWidget::startClicked()
{
    if (mActionState == ActionState::STOPPED)
    {
        mFoundFilesList->clear();
        mProgressBar->setValue(0);
        mBytesProcessed = 0;
        mActionState = ActionState::RUNNING;
        mStartButton->setText("&Cancel");
        const int idealThreadCount = QThread::idealThreadCount();
        mThreads.reserve(idealThreadCount);
        mPaths.clear();
        QDirIterator dirIt(mSearchDirectoryLine->text(), QDirIterator::Subdirectories);
        while (dirIt.hasNext())
        {
            dirIt.next();
            if (QFileInfo(dirIt.filePath()).isFile())
            {
                if (QFileInfo(dirIt.filePath()).suffix() == "txt")
                    mPaths.push_back(dirIt.filePath());
            }
        }
        for (int index = 0; index < mPaths.size(); ++index)
        {
            QFileInfo fileInfo(mPaths[index]);
            mDirectorySizeInBytes += fileInfo.size();
        }
        const std::vector<Range> ranges = GenerateRanges(idealThreadCount, mPaths.size());
        for (size_t index = 0; index < idealThreadCount; ++index)
            mThreads.push_back(new FindWordInFileThread(mPaths, mSearchWordLine->text(), ranges[index].mStart, ranges[index].mLength));

        for (size_t index = 0; index < mThreads.size(); ++index)
        {
            QObject::connect(mThreads[index], SIGNAL(progressChanged(qint64)), this, SLOT(progressChanged(qint64)));
            QObject::connect(mThreads[index], SIGNAL(fileFound(const QString&)), this, SLOT(fileFound(const QString&)));
        }

       for (size_t index = 0; index < idealThreadCount; ++index)
           mThreads[index]->start();
    }
    else
    {
        mActionState = ActionState::STOPPED;
        mStartButton->setText("&Start");
        for (size_t index = 0; index < mThreads.size(); ++index)
            mThreads[index]->cancel();
    }
}
stasJun вне форума Ответить с цитированием
Старый 24.10.2016, 10:08   #86
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

... или просто создаются новые потоки каждый раз, но старые не уничтожаются + остаются в списке.

Как кстати определяется завершение поиска? (для смены кнопка обратно на Start и т.п.)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.10.2016, 10:15   #87
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
... или просто создаются новые потоки каждый раз, но старые не уничтожаются + остаются в списке.

Как кстати определяется завершение поиска? (для смены кнопка обратно на Start и т.п.)
Код:
for (size_t index = 0; index < idealThreadCount; ++index)
           mThreads[index]->start();
    }
    else
    {
        mActionState = ActionState::STOPPED;
        mStartButton->setText("&Start");
        for (size_t index = 0; index < mThreads.size(); ++index)
            mThreads[index]->cancel();
    }
Цитата:
... или просто создаются новые потоки каждый раз, но старые не уничтожаются + остаются в списке.
- нет я с разными папаками пробую, то что было удаляется но другое выводит по 2 раза просто

Последний раз редактировалось Alex11223; 24.10.2016 в 10:22.
stasJun вне форума Ответить с цитированием
Старый 24.10.2016, 10:21   #88
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут этот код? Это ж при отмене, а как при просто завершении?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.10.2016, 10:37   #89
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Причем тут этот код? Это ж при отмене, а как при просто завершении?
внимательно смотрите))
Код:
for (size_t index = 0; index < idealThreadCount; ++index)
           mThreads[index]->start(); - это при  завершении меняет с кансел на старт
    }
    else
    {
        mActionState = ActionState::STOPPED;
        mStartButton->setText("&Start");
        for (size_t index = 0; index < mThreads.size(); ++index)
            mThreads[index]->cancel();
    }
stasJun вне форума Ответить с цитированием
Старый 24.10.2016, 10:40   #90
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

скину чтобы было понятно весь код функции
Код:
void FindFilesWidget::startClicked()
{
    if (mActionState == ActionState::STOPPED)
    {
        mFoundFilesList->clear();
        mProgressBar->setValue(0);
        mBytesProcessed = 0;
        mActionState = ActionState::RUNNING;
        mStartButton->setText("&Cancel");
        const int idealThreadCount = QThread::idealThreadCount();
        mThreads.reserve(idealThreadCount);
        mPaths.clear();
        QDirIterator dirIt(mSearchDirectoryLine->text(), QDirIterator::Subdirectories);
        while (dirIt.hasNext())
        {
            dirIt.next();
            if (QFileInfo(dirIt.filePath()).isFile())
            {
                if (QFileInfo(dirIt.filePath()).suffix() == "txt")
                    mPaths.push_back(dirIt.filePath());
            }
        }
        for (int index = 0; index < mPaths.size(); ++index)
        {
            QFileInfo fileInfo(mPaths[index]);
            mDirectorySizeInBytes += fileInfo.size();
        }
        const std::vector<Range> ranges = GenerateRanges(idealThreadCount, mPaths.size());
        for (size_t index = 0; index < idealThreadCount; ++index)
            mThreads.push_back(new FindWordInFileThread(mPaths, mSearchWordLine->text(), ranges[index].mStart, ranges[index].mLength));

        for (size_t index = 0; index < mThreads.size(); ++index)
        {
            QObject::connect(mThreads[index], SIGNAL(progressChanged(qint64)), this, SLOT(progressChanged(qint64)));
            QObject::connect(mThreads[index], SIGNAL(fileFound(const QString&)), this, SLOT(fileFound(const QString&)));
        }

       for (size_t index = 0; index < idealThreadCount; ++index)
           mThreads[index]->start();
    }
    else
    {
        mActionState = ActionState::STOPPED;
        mStartButton->setText("&Start");
        for (size_t index = 0; index < mThreads.size(); ++index)
            mThreads[index]->cancel();
    }
}
stasJun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск слов в файле Stepan_P Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 0 25.12.2015 14:14
Поиск слов в текстовом файле slipkos Помощь студентам 4 02.06.2013 19:18
Поиск симметричных слов в файле Almost Паскаль, Turbo Pascal, PascalABC.NET 1 10.01.2013 08:53
Поиск слов в файле сушка Общие вопросы по программированию, компьютерный форум 1 08.04.2012 12:44
Поиск слов в текстовом файле svt Помощь студентам 8 07.11.2009 19:56