![]() |
|
![]() ![]() ![]() |
|
oxanapal |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.3.2016 Репутация: нет Всего: нет |
Мне нужно написать консольную программу:
Которая для заданного каталога файлов на диске находит файлы, содержащие заданное слово с использованием многопоточности. Программа должна вывести в столбик имена найденных файлов в алфавитном порядке. Я сделалa програму но нужно ее было еще переделать и сделать с Mutexом, и я не знаю правильно ли я сделала с ним. Посмотрите и скажите верно ли все Хедер:
CPP:
Main:
Это сообщение отредактировал(а) oxanapal - 3.10.2016, 12:12 |
||||||
|
|||||||
ss |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 17.5.2007 Репутация: нет Всего: нет |
во втором участке кода, функ. void FindWordInFileThread::run() , строку 29 QMutexLocker locker(mMutex); можно
поставить в строку 31 ... if (line.contains(mWord, Qt::CaseInsensitive)) { QMutexLocker locker(mMutex); ... т.к. QMutexLocker блокирует || выполнения while. Все потоки стопорятся на проверке. пусть проверка выполняется в каждом потоке своя а результат будет записываться по очереди для потоков тем самым запись результата не будет влиять на поиск слова в строке для остальных потоков. Это сообщение отредактировал(а) ss - 4.10.2016, 14:36 |
|||
|
||||
oxanapal |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.3.2016 Репутация: нет Всего: нет |
Всем добрый день. Я немного доделала програму, сделала в виде виджета, додал прогрес бар и т.д. Но наткнулась на проблему: 1) Выдает ошибку, но делал как в книжке: Професиональное програмирование Макс Шлее(стр 551) но в моему случаи не пашет. Тема:Обмен сообщениями, потоки и слоты, сигналы. Какую мне выдает ошибку: FindWordInFileThread.obj:-1: error: LNK2019: unresolved external symbol "public: void __cdecl FindWordInFileThread::complited(int)" (?complited@FindWordInFileThread@@QEAAXH@Z) referenced in function "public: virtual void __cdecl FindWordInFileThread::run(void)" (?run@FindWordInFileThread@@UEAAXXZ) та debug\FindFilesWidget.exe:-1: error: LNK1120: 1 unresolved externals я думаю оно кричит через этот код(но в книге работает), подскажите как решить проблему:
код где это используется:
CPP файли:
Присоединённый файл ( Кол-во скачиваний: 0 ) ![]() |
||||||||||
|
|||||||||||
ss |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 17.5.2007 Репутация: нет Всего: нет |
линкер говорит что он не может найти реализацию метода complited(int) ,описанного в h-файле, в файле cpp. Нужно проверить описание и реализацию методов. Обратить внимание на типы параметров у методов. Все методы описанные в h-файле должны иметь реализацию (тело) Так же какое-то несоответствие с методом run(void). Возможно нет слова "override" в перегруженном методе. |
|||
|
||||
oxanapal |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.3.2016 Репутация: нет Всего: нет |
зараз кричит на прогрес бар: QObject::connect: No such slot QProgressBar::progressChanged(int) in ..\FindFilesWidget\FindFilesWidget.cpp:89 но такой слот есть
Это сообщение отредактировал(а) oxanapal - 17.10.2016, 16:04 |
||||||
|
|||||||
oxanapal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.3.2016 Репутация: нет Всего: нет |
Нашлась ошибка:
Обжекст не додала в начало:
Но прогрес бар так и не работает( |
|||
|
||||
ss |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 17.5.2007 Репутация: нет Всего: нет |
Вы думаете, компилятор вас обманывает ? здесь ..\FindFilesWidget\FindFilesWidget.cpp:89 указан виджет QProgressBar а слот progressChanged(int number) был описан в классе FindFilesWidget. Не тот задан класс (mProgressBar) Это сообщение отредактировал(а) ss - 17.10.2016, 20:27 |
|||
|
||||
oxanapal |
|
||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.3.2016 Репутация: нет Всего: нет |
ss, я там лаханулась, нужно было this вместо progressBar в connect
нужно
но теперь другая проблема, через wait у меня кнопка кансел срабатывает и прогрес бар показывает результат после окончания работы. И как с этим боротся хз |
||||
|
|||||
ss |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 17.5.2007 Репутация: нет Всего: нет |
не совсем понятно " wait у меня кнопка кансел срабатывает и прогрес бар показывает результат после окончания работы. И как с этим боротся хз "
прогрессбар изменяет свою шкалу когда нажали кнопу. Нужно чтобы прогрессбар отображал прогресс на каждом этапе выполнения т.е. постепенно заполнялся ? |
|||
|
||||
oxanapal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.3.2016 Репутация: нет Всего: нет |
ss, именно, а у меня через wait прорес сразу показывает 100% когда все слова нашла програма тоесть при окончании програмы. а нужно чтобы постпенно заполнялся
я скидаю весь проект, так как много уже изменений сделал и сложно суда частями скидать чтобы понятно было Это сообщение отредактировал(а) oxanapal - 18.10.2016, 13:10 Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
|||
|
||||
ss |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 17.5.2007 Репутация: нет Всего: нет |
на счет постепенного заполнения то :
скорее всего потоки слишком быстро выполняют свою работу. Можно попробовать поставить задержку в цикле обработки файлов (где emit complited). QThread::currentThread()->msleep(1000); // 1000 - 1 сек и поставить вывод в консоль сообщения чтобы убедиться в постоянном вызове слота. void FindFilesWidget::progressChanged(int number) { qDebug()<< number; mProgressBar->setValue(mProgressBar->value() + ((number / mFileSize)* 100)); } |
|||
|
||||
oxanapal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.3.2016 Репутация: нет Всего: нет |
ss, cделала, не помогло
|
|||
|
||||
ss |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 17.5.2007 Репутация: нет Всего: нет |
из кода в архиве:
сигнал progressChanged используется в void FindWordInFileThread::run() а объявлен в FindFilesWidget тогда надо emit FindFilesWidget.progressChanged ; где FindFilesWidget будет экземпляр класса //-------------------------------------------- void FindWordInFileThread::run() строка if (mIsCancelled) нужно файл закрыть //-------------------------------------------- класс FindWordInFileThread сигнал void completed(QString, bool); а связывание connect(mThreads[index], SIGNAL(completed(qint64)), this, SLOT(progressChanged(qint64))); типы не соответствуют. Не тот тип , нет и сигнала. Это должно в консоль выводиться. да и все равно сигнал будет использовать отложенные соединения (queued connections). |
|||
|
||||
ss |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 17.5.2007 Репутация: нет Всего: нет |
на чистом проекте делал изменение прогрессбара в потоках.
Использовал общую переменную для сохранения значения прогрессбара _valueIndicator и таймер на форме который периодически проверяет значение переменной и делает обновление прогрессбара
Присоединённый файл ( Кол-во скачиваний: 1 ) ![]() |
||||
|
|||||
oxanapal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.3.2016 Репутация: нет Всего: нет |
ss, посмотрел. я так само делаю. кроме
и походу нужно еще timerEvent сделать, у меня нету. Присоединённый файл ( Кол-во скачиваний: 0 ) ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |