Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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



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

Цитата:
Сообщение от 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 в 18:47.
stasJun вне форума   Ответить с цитированием
Старый 17.10.2016, 19:09   #22
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 11,938
Репутация: 2453

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

не. Там где поток читает байты из файла.
Alex11223 на форуме   Ответить с цитированием
Старый 17.10.2016, 19:21   #23
stasJun
Форумчанин
 
Регистрация: 17.10.2016
Сообщений: 95
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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, 19:34   #24
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 11,938
Репутация: 2453

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

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

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

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

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

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

Все нормально с названиями и с первого клика вроде.
Но надо как-то определять завершение поиска (кроме нажатия отмены). Например считать количество завершенных потоков (по сигналу 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 вроде ж и так должен закрыть в деструкторе.
Alex11223 на форуме   Ответить с цитированием
Старый 17.10.2016, 20:24   #27
stasJun
Форумчанин
 
Регистрация: 17.10.2016
Сообщений: 95
Репутация: 10
По умолчанию

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

Последний раз редактировалось Alex11223; 17.10.2016 в 20:49.
stasJun вне форума   Ответить с цитированием
Старый 17.10.2016, 20:48   #28
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 11,938
Репутация: 2453

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

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

Я бы так делал:
Код:

// до запуска
mBytesProcessed = 0;
...

void FindFilesWidget::progressChanged(qint64 number)
{
    mBytesProcessed += number;
    mProgressBar->setValue(mBytesProcessed / (double) mFileSize * 100);
}

Alex11223 на форуме   Ответить с цитированием
Старый 17.10.2016, 21:00   #29
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 11,938
Репутация: 2453

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

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

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

И прогресс по идее тоже не обновляется во время работы, только после завершения все сразу.
Alex11223 на форуме   Ответить с цитированием
Старый 17.10.2016, 21:01   #30
stasJun
Форумчанин
 
Регистрация: 17.10.2016
Сообщений: 95
Репутация: 10
По умолчанию

исправил, да до 100 % зараз но канссел только меняеться когда 100% пройдет, а так пишеться старт(
stasJun вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




14:19.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru