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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2016, 10:50   #91
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И куда смотреть?

У потока есть такие варианты завершения:
  1. После поиска во всех файлах ("happy path")
  2. При ошибке (не удалось открыть файл, ...)
  3. Отмена (вызов cancel)

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

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
И куда смотреть?

У потока есть такие варианты завершения:
  1. После поиска во всех файлах ("happy path")
  2. При ошибке (не удалось открыть файл, ...)
  3. Отмена (вызов cancel)

В коде выше обрабатывается только 3 вариант (вызов cancel у всех потоков).
И даже для этого случая не видно уничтожения потоков/очистки mThreads.
Для проверки файлов у меня есть проверка,
Код:
void FindWordInFileThread::run()
{
    mIsCancelled = false;
    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())
        {
            if (mIsCancelled)
            {
                file.close();
                return;
            }
            QString line = textStream.readLine();
            if (line.contains(mWord, Qt::CaseInsensitive))
            {
                emit fileFound(file.fileName());
                break;
            }
        }
        if (!mIsCancelled)

        emit progressChanged(file.size());
        qDebug() << file.size();
        file.close();
    }
}
если удалять потоки:
Код:
for (size_t index = 0; index < idealThreadCount; ++index)
            delete mThreads[index];
то крешится
stasJun вне форума Ответить с цитированием
Старый 24.10.2016, 11:45   #93
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от stasJun Посмотреть сообщение
Для проверки файлов у меня есть проверка,
В потоке-то есть, но никто извне не узнает об этом (ну или хотя бы просто о том, что поток завершился)
Цитата:
Сообщение от stasJun Посмотреть сообщение
если удалять потоки: то крешится
Ну так удалять надо не когда вздумалось, а после их завершения.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.10.2016, 22:21   #94
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
В потоке-то есть, но никто извне не узнает об этом (ну или хотя бы просто о том, что поток завершился)

Ну так удалять надо не когда вздумалось, а после их завершения.
удаляю
Код:
FindFilesWidget::~FindFilesWidget()
{
    for (size_t index = 0; index < mIdealThreadCount; ++index)
        delete mThreads[index];
}
stasJun вне форума Ответить с цитированием
Старый 24.10.2016, 22:23   #95
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

а как сделать сигнал на закрытия програмы хрестиком?
Код:
QObject::connect(тут как  хрестик обозначить?, SIGNAL(clicked()), &app, SLOT(quit()));
и как мне проверять mThreads пустой или нет?
isEmpty подойдет?
stasJun вне форума Ответить с цитированием
Старый 24.10.2016, 22:24   #96
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от stasJun Посмотреть сообщение
удаляю
Так деструктор виджета вызовется только при его закрытии.

Цитата:
Сообщение от stasJun Посмотреть сообщение
а как сделать сигнал на закрытия програмы хрестиком?
http://stackoverflow.com/questions/1...x-close-button
Код:
....
protected:
    void closeEvent(QCloseEvent *event); override;
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 24.10.2016 в 22:30.
Alex11223 вне форума Ответить с цитированием
Старый 24.10.2016, 22:29   #97
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так деструктор виджета вызовется только при его закрытии.
так мне и нужно)
если я не закрываю виджет но заново жму кнопку, то мне нужно сделать иф, если mThreads не пусчтой то я все удаляю и делаю mThreads.clear();
mThreads.reserve(mIdealThreadCount) ;
правильно я думаю?
Код:
if (mActionState == ActionState::STOPPED)
    {
        mFoundFilesList->clear();
        mProgressBar->setValue(0);
        mBytesProcessed = 0;
        mActionState = ActionState::RUNNING;
        mStartButton->setText("&Cancel");
        //тут надо иф  этот  делать
        mThreads.clear();
        mThreads.reserve(mIdealThreadCount);
stasJun вне форума Ответить с цитированием
Старый 24.10.2016, 22:34   #98
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
да, можно так (только еще удалить все объекты если не пустой), но обработка всех вариантов завершения описанных выше все равно нужна же, так что можно и там очищать.
я сделаю как я думаю, если препод скажет что не везде удаляю переделаю)
я правильно конект для хрестика сделал? я в самом конце делаю
Код:
void FindFilesWidget::closeEvent(QCloseEvent* event)
{
    QWidget::closeEvent(event);
}
Код:
  ................
else
    {
        mActionState = ActionState::STOPPED;
        mStartButton->setText("&Start");
        for (size_t index = 0; index < mThreads.size(); ++index)
            mThreads[index]->cancel();
    }
    QObject::connect(this, SIGNAL(clicked()), SLOT(closeEvent()));
}

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

Да удаление-то ладно, но там ж сейчас всегда будет висеть кнопка отмены (пока ее не нажмут) когда на самом деле потоки давно остановились.


Цитата:
Сообщение от stasJun Посмотреть сообщение
я правильно конект для хрестика сделал?
это не сигнал, просто переопределяемая функция родительского класса.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
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