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

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

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

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

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

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

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
сообщать периодически сколько байт прочитано, в цикле чтения файла.
я так понял от сюда?
Код:
while (dirIt.hasNext())
        {
            dirIt.next();
            if (QFileInfo(dirIt.filePath()).isFile())
            {
                if (QFileInfo(dirIt.filePath()).suffix() == "txt")
                    paths.push_back(dirIt.filePath());
            }
        }
но честно хз как реализовать это)
а почему отмена кнопка крешиться?

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

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

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
не. Там где поток читает байты из файла.
не то скинул:
Код:
for (size_t index = mStartIndex; index < mStartIndex + mNumElements; ++index)
    {
        QFile file(mFilePath[index]);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
            return;

        QTextStream textStream(&file);
        while (!textStream.atEnd())
        {
            QString line = textStream.readLine();
            if (line.contains(mWord, Qt::CaseInsensitive))
            {
                mFoundFiles.push_back(QFileInfo(mFilePath[index]).filePath());
                break;
            }
        }
stasJun вне форума Ответить с цитированием
Старый 17.10.2016, 18:34   #24
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

http://doc.qt.io/qt-5/qtextstream.html#pos
или QFile pos
(наверно лучше второе судя по описанию первого)

или еще можно складывать длину строк (+= line.length()), но 1 байт == 1 символу только если это латинские символы в UTF-8 или если файл не юникодный.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.10.2016, 18:38   #25
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
http://doc.qt.io/qt-5/qtextstream.html#pos
или QFile pos
(наверно лучше второе судя по описанию первого)

или еще можно складывать длину строк (+= line.length()), но 1 байт == 1 символу только если это латинские символы в UTF-8 или если файл не юникодный.
спасибо. посмотрите если не сложно еще почему кнопка отмена только с второго клика изменяет названия с стпрта- отмена и то крешится
stasJun вне форума Ответить с цитированием
Старый 17.10.2016, 19:06   #26
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Все нормально с названиями и с первого клика вроде.
Но надо как-то определять завершение поиска (кроме нажатия отмены). Например считать количество завершенных потоков (по сигналу completed).

А падает наверно потому что exit как я понял http://doc.qt.io/qt-5/qthread.html#exit не предназначен для этого, он требует event loop.

Чтобы убить поток есть terminate, но вообще обычно не стоит так делать.
Лучше сделать какой-то "флаг" у потоков, из основного потока устанавливать его при нажатии отмены, а в потоках проверять его периодически и завершаться если надо.

Как-то так:
Код:
#include <atomic>

class FindWordInFileThread : public QThread
{
...
public slots:
    void cancel();
private:
    std::atomic<bool> mIsCancelled;
Код:
FindWordInFileThread::FindWordInFileThread
    ....
    , mIsCancelled(false)
{}

void FindWordInFileThread::run()
{
    ...
        while (!textStream.atEnd())
        {
            if (mIsCancelled)
                return;
    ...
}

void FindWordInFileThread::cancel()
{
    mIsCancelled = true;
}
Код:
        for (size_t index = 0; index < mThreads.size(); ++index)
            mThreads[index]->cancel();
file.close кстати наверно не нужен в run, QFile вроде ж и так должен закрыть в деструкторе.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.10.2016, 19:24   #27
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

переделал, но доходит до 91% и стоит, и если назад нажать на старт крешится.
Изображения
Тип файла: png Untitled.png (9.6 Кб, 67 просмотров)

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

91 наверно просто как-то неправильно считается прогресс.
Может быть просто из-за обрезания до целого в setValue накапливается.

Я бы так делал:
Код:
// до запуска
mBytesProcessed = 0;
...

void FindFilesWidget::progressChanged(qint64 number)
{
    mBytesProcessed += number;
    mProgressBar->setValue(mBytesProcessed / (double) mFileSize * 100);
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.10.2016, 20:00   #29
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

а, насчет отмены и завершения, я не заметил, что там есть wait после запуска потоков.

Тогда отмена вообще не может работать, у вас же UI поток занят ожиданием завершения потоков.

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

исправил, да до 100 % зараз но канссел только меняеться когда 100% пройдет, а так пишеться старт(
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