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

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

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

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

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

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

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
где они совпадают-то? вы ж к completed пытаетесь подключить fileThreadProgressChanged.
так правильно. сигнал- completed
слот fileThreadProgressChanged
а что нужно подключать?
progressChanged тоже сигнал

Писи. Вы извиняйте. я уже зпутался окончалтельно и ничего уже не пойму, что куда нужно, что нужно делать
stasJun вне форума Ответить с цитированием
Старый 19.10.2016, 11:27   #52
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так в моем примере с 2 сигналами у них разные параметры, одинаковые были в начальном коде, где был только сигнал для количества байт (то есть в моем примере начальный completed переименован progressChanged и добавлен новый сигнал для результата поиска, его я назвал completed, но он не имеет отношения к тому что было раньше).

В предыдущем сообщении все ж описано. http://programmersforum.ru/showthrea...=5#post1637969
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.10.2016, 11:41   #53
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так в моем примере с 2 сигналами у них разные параметры, одинаковые были в начальном коде, где был только сигнал для количества байт (то есть в моем примере начальный completed переименован progressChanged и добавлен новый сигнал для результата поиска, его я назвал completed, но он не имеет отношения к тому что было раньше).

В предыдущем сообщении все ж описано. http://programmersforum.ru/showthrea...=5#post1637969
переделал:
Код:
 for (size_t index = 0; index < mThreads.size(); ++index)
            connect(mThreads[index], SIGNAL(progressChanged(qint64)), this, SLOT(fileThreadProgressChanged(qint64)));
я просто в упор не мог понять, и не подумал что там дествительно переменовали переменную и переменная с completed другие аргументы принимает.
Теперь без все ок. но подскажите как сделать чтобы не 1 поток- 1 слово
а 1 поток- много слов работало. а то не прикольно что кансел в конце только срабатывает и прогрес бар через wait
stasJun вне форума Ответить с цитированием
Старый 19.10.2016, 11:52   #54
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

"1 поток- много" никак не связано с "не прикольно что кансел в конце только срабатывает и прогрес бар через wait".

Чтобы работала отмена (и чтобы вообще не замирал весь UI во время поиска) надо

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
не делать ничего после запуска потоков (убрать wait), всю обработку результата и т.п. делать только по сигналу (completed, ...)

........

в completed наверно надо передавать имя файла и результат (в данном случае bool найдено/не найдено).
При его получении выводить результат и считать количество завершенных потоков для определения завершения всего поиска.


А чтобы работало 1 поток=много файлов надо разобраться в коде/примере и доделать его под это.

тут http://programmersforum.ru/showthrea...=4#post1637756
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Как минимум found сейчас неправильно устанавливается, будет всегда true после первого файла в котором нашли нужную строку.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 19.10.2016 в 11:56.
Alex11223 вне форума Ответить с цитированием
Старый 19.10.2016, 12:01   #55
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
"1 поток- много" никак не связано с "не прикольно что кансел в конце только срабатывает и прогрес бар через wait".

Чтобы работала отмена (и чтобы вообще не замирал весь UI во время поиска) надо



если я убираю wait сразу креш при запуске програмы.

Цитата:
в completed наверно надо передавать имя файла и результат (в данном случае bool найдено/не найдено).
При его получении выводить результат и считать количество завершенных потоков для определения завершения всего поиска.
- я ж это делаю, вывожу в емите

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

Цитата:
Сообщение от stasJun Посмотреть сообщение
если я убираю wait сразу креш при запуске програмы.
Что именно в коде сейчас? Естественно надо убрать не только wait, а все что происходит в обработчике клика кнопки после запуска потоков (wait, вывод файлов в QListWidget, удаление потоков, ...)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.10.2016, 13:45   #57
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Что именно в коде сейчас? Естественно надо убрать не только wait, а все что происходит в обработчике клика кнопки после запуска потоков (wait, вывод файлов в QListWidget, удаление потоков, ...)
я закоментил что удалил
Код:
void FindFilesWidget::startClicked()
{
    if(mActionState == ActionState::STOPPED)
    {
        mActionState = ActionState::RUNNING;
        mStartButton->setText("&Cancel");
        const int idealThreadCount = QThread::idealThreadCount();
        mThreads.reserve(idealThreadCount);

        QDirIterator dirIt(mSearchDirectoryLine->text(), QDirIterator::Subdirectories);
        std::vector<QString> paths;
        while (dirIt.hasNext())
        {
            dirIt.next();
            if (QFileInfo(dirIt.filePath()).isFile())
            {
                if (QFileInfo(dirIt.filePath()).suffix() == "txt")
                    paths.push_back(dirIt.filePath());
            }
        }
        for (int  index = 0; index < paths.size(); ++index)
        {
            QFileInfo fileInfo(paths[index]);
            mFileSize += fileInfo.size();
        }
        const std::vector<Range> ranges = GenerateRanges(idealThreadCount, paths.size());
        std::vector<QString> foundFiles;
        QMutex mutex;

        for (size_t index = 0; index < idealThreadCount; ++index)
            mThreads.push_back(new FindWordInFileThread(paths, mSearchWordLine->text(), ranges[index].mStart, ranges[index].mLength, foundFiles, &mutex));

        for (size_t index = 0; index < mThreads.size(); ++index)
            connect(mThreads[index], SIGNAL(progressChanged(qint64)), this, SLOT(fileThreadProgressChanged(qint64)));


        for (size_t index = 0; index < idealThreadCount; ++index)
            mThreads[index]->start();
        //for (size_t index = 0; index < idealThreadCount; ++index)
            //mThreads[index]->wait();

        std::sort(foundFiles.begin(), foundFiles.end());

        //for (size_t index = 0; index < idealThreadCount; ++index)
            //delete mThreads[index];

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

крешится по идее не должно от этого, но незакомментированные строки после start не имеют никакого смысла. Этот код же выполнится сразу после запуска, когда еще нет ничего в foundFiles.

Надо убрать foundFiles вообще и делать все что происходит тут в слоте для completed.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.10.2016, 14:19   #59
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
крешится по идее не должно от этого, но незакомментированные строки после start не имеют никакого смысла. Этот код же выполнится сразу после запуска, когда еще нет ничего в foundFiles.

Надо убрать foundFiles вообще и делать все что происходит тут в слоте для completed.
а foundFiles где искать?
у меня сигнал completed . а слота такого нету
stasJun вне форума Ответить с цитированием
Старый 19.10.2016, 14:31   #60
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не нужен foundFiles, я ж описал уже 2 раза.

Сделать сигнал в который передается имя файла и результат поиска (найден/не найден), в слоте для него добавлять в UI этот файл если найден.

И там же можно считать либо количество завершенных потоков (если 1 поток=1 файл), либо количество завершенных файлов (если 1 поток=много файлов, и количество файлов известно до запуска) для определения завершения всего поиска.
То есть например до запуска сохранить их число, при каждым срабатывании слота отнимать 1, когда стало 0 — значит поиск завершился (включить обратно кнопку Старт и т.п.)

Цитата:
Сообщение от stasJun Посмотреть сообщение
у меня сигнал completed . а слота такого нету
А зачем нужен сигнал если нигде нет слота для него?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 19.10.2016 в 14:36.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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