Russian Qt Forum
Апрель 25, 2024, 21:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 12
1  Qt / Вопросы новичков / Re: Память, занимаемая после вызова QDir::entryList : Апрель 24, 2023, 17:21
Сделаю через QDirIterator
Код:
QDirIterator it("D:\\FolderSend");
    QStringList list;
    while(it.hasNext())
        list.push_back(it.next());
Но метод не очень красивый
2  Qt / Вопросы новичков / Память, занимаемая после вызова QDir::entryList : Апрель 24, 2023, 16:33
Здравствуйте
Необходимо получить список имен файлов из папки. В этой директории может находиться много файлов (условно 100 000). Если я делаю так:
Код:
QDir dir("D:\\Folder");
QStringList list = dir.entryList();
Потом смотрю в диспетчере задач сколько памяти занимает приложение, то получается в 3 раза больше (на 5000 файлов 4.1 Мегабайт), чем если делаю так:
Код:
QStringList list;
    for(int i = 0; i < 5000; i++)
        list.push_back("file123456789");
(в этом случае приложение занимает 1.7 мегабайт)

Может кто-нибудь знает, что можно сделать, чтобы освобождалась память после вызова QDir::entryList?
3  Qt / Общие вопросы / Re: Последовательное открытие большого количества файлов : Октябрь 19, 2022, 17:12
Цитировать
можно и так попробовать. можно сделать пул потоков, каждый из которых будет работать со своей пачкой файлов.
В принципе это выход из ситуации: сделать пул из 10-20 потоков, которые только открывают файлы и посылают дескриптор в очередь другого потока, который вычитывает данные из файлов, посылает по сети и закрывает файлы. Технически не самое простое решение + непонятно, как поведет себя файловая система, если сразу 10 потоков начнут открывать файлы. Предположу, что задержки могут увеличиться с 30 мс. Тут пока не попробуешь, точно не скажешь
Цитировать
а как само задание звучит? может можно придумать другой подход?
Мне перефразировали так: "Написать передающую и приемную части программ, которые передают по сети файлы с высокой скоростью по заданному протоколу". 100 000 файлов - это крайний случай, который должна выполнять программа.
Цитировать
Попробуй раскопировать в папки по 500 файлов и оттуда отправлять.
Попробовал. Не помогло.
Еще попробовал под Линуксом запустить показанный вариант - все работает!
Было бы здорово понять, можно ли что-то сделать (как-то настроить) с файловой системой винды, чтобы не было задержек при открытии файлов
4  Qt / Общие вопросы / Re: Последовательное открытие большого количества файлов : Октябрь 17, 2022, 08:54
Тестировал, скорость выходит в разы меньше, чем при передаче одного большого файла. Я написал про передачу файлов, потому что мог возникнуть вопрос: "Зачем в реальных задачах открывать и закрывать тысячи фалов?"
Как предлагаешь тут многопоточность применить? Один поток открывает файл, а другой передает по сети?
5  Qt / Общие вопросы / Re: Последовательное открытие большого количества файлов : Октябрь 14, 2022, 16:26
Не помогло Грустный
Если открываю 1000 файлов, потом закрываю 1000 файлов, делаю паузу 5 секунд, потом открываю следующую 1000, то на этой второй тысяче файлы начинают открываться медленнее.

Код:
#include <QCoreApplication>
#include<QFile>
#include<QDir>
#include<QTime>
#include<QElapsedTimer>
#include<QDebug>

const QString folderPath = "D:\\ForSend\\FolderSend3";
const QChar subdirSeparator = '\\';

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QDir dir(folderPath);
    QStringList dirFiles = dir.entryList(QDir::Files|QDir::NoDotAndDotDot|QDir::Hidden);
    int counter = 0;
    QElapsedTimer timer;
    for (QStringList::const_iterator it = dirFiles.begin(); it != dirFiles.end(); ++it) {
        QString fullPath1 = folderPath + subdirSeparator + *it;
        QFile f(fullPath1);
        QTime t1 = QTime::currentTime();
        f.open(QIODevice::ReadOnly);
        QTime t2 = QTime::currentTime();
        //f.close();
        qDebug() << t1 << endl << t2 << endl << *it << counter;
        counter++;
        if(counter == 1000){
            counter = 0;
            timer.start();
            while (timer.elapsed() < 5000) {
                continue;
            }
        }
    }
    return a.exec();
}

Если перезапустить приложение, то 1000 файлов опять быстро открывает.

Как будто надо что-то почистить, обновить...
6  Qt / Общие вопросы / Re: Последовательное открытие большого количества файлов : Октябрь 14, 2022, 10:49
Ты имеешь в виду, открыть сразу пару тысяч файлов, передать, закрыть; после этого опять открыть пару тысяч файлов, передать и закрыть?
7  Qt / Общие вопросы / Re: Последовательное открытие большого количества файлов : Октябрь 14, 2022, 10:21
Одно из условий задания - передавать много маленьких файлов

Может что-то с таблицей дескрипоров происходит (например, переполнение), но я не знаю, как проверить это гипотезу
8  Qt / Общие вопросы / Re: Последовательное открытие большого количества файлов : Октябрь 14, 2022, 09:35
Что можно сделать, чтобы избежать больших задержек при открытии файлов?
9  Qt / Общие вопросы / Последовательное открытие большого количества файлов : Октябрь 13, 2022, 17:22
Здравствуйте
У меня задача передать по сети около 100 000 файлов размером от 100 килобайт до 1 мегабайта. Скорость важна.

Проблема в том, что на открытие каждого файла уходит около 30 миллисекунд. При этом передача файла идет меньше 10 мс.

Если файлов не 100 000, а 1500, то работает нормально. Если 2000, то медленно открывает.

Тестовый код такой (тут не посылаю никуда файл):
Код:
#include <QCoreApplication>
#include<QFile>
#include<QDir>
#include<QTime>
#include<QDebug>

const QString folderPath = "D:\\ForSend\\FolderSend";
const QChar subdirSeparator = '\\';

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QDir dir(folderPath);
    QStringList dirFiles = dir.entryList(QDir::Files|QDir::NoDotAndDotDot|QDir::Hidden);
    for (QStringList::const_iterator it = dirFiles.begin(); it != dirFiles.end(); ++it) {
        QString fullPath1 = folderPath + subdirSeparator + *it;
        QFile f(fullPath1);
        QTime t1 = QTime::currentTime();
        f.open(QIODevice::ReadOnly);
        QTime t2 = QTime::currentTime();
        f.close();
        qDebug() << t1 << endl << t2 << endl << *it;
    }
    return a.exec();
}

Операционная система: Windows 10. Замена QFile на FILE* в стиле С не меняет дело.

Подскажите, пожалуйста, в чем может быть причина задержки при открытии файлов?
10  Qt / Вопросы новичков / Чтение Hyperlinks из ячейки файла Microsoft Excel c помощью библиотеки QtXlsx : Январь 19, 2021, 16:01
Здравствуйте
Мне нужно получать адрес ссылки (бывает, что там ссылка на другой лист, а бывает ссылка на сайт) из ячейки файла Microsoft Excel.
Использую библиотеку QtXlsx https://qtxlsx.debao.me/
Записывать в ячейку ссылку получается с помощью функции workSheet->writeHyperlink
До этого делал с помощью QAxObject, но хочу уйти от этого класса, потому что хочется, чтобы программа работала без запуска Microsoft Excel
Код:
QAxObject *links = cell->querySubObject("Hyperlinks");
QAxObject *linkCell = links->querySubObject("Item(int)",1);

Можете подсказать, как можно получить адрес ссылки с помощью библиотеки QtXlsx? Или можете подсказать хорошую библиотеку для работы с Excel-файлами, которую можно встроить в проект на С++/Qt?
11  Qt / Дополнительные компоненты / Самопроизвольное отключение сигнала readyRead() класса QSerialPort : Февраль 20, 2020, 13:26
Здравствуйте
У меня есть программа, которая пересылается файл в устройство, используя COM-порт. Под ОС Windows работает нормально, при переносе на OC Raspbian Buster возникает проблема при записи файла в устройство. При чтении из устройства работает нормально (если не используется функция QSerialPort::write).
Точнее сначала работает нормально, а в какой-то момент перестает отслеживать сигнал readyRead класса QSerialPort. Выводится ошибка QSerialPort::UnknownError. COM-порт - виртуальный USB. Выключение и включение COM-порта и перезапуск программы ситуацию не исправляют. COM приходит в нормальное состояние только или перезагрузкой устройства, или перезагрузкой raspberry. Команда cat /proc/meminfo показывает, что заполнения памяти нет. Использую Raspberry Pi 3. flush() после write() и clear() перед write ситуацию не меняют.
В отличие от Windows в Rasbian много неправильных пакетов (мусора). Передача перестает работать каждый раз через разное число посланных пакетов и через разное количество мусорных.

Можете подсказать в чем может быть проблема? Из-за чего в какой-то момент перестает работать сигнал ReadyRead() ?
12  Qt / Qt-инструментарий / Re: qtCreator cross compiling raspberry from windows : Январь 23, 2020, 09:06
У кого-нибудь получилось сделать кросс-компиляцию qt для raspberry pi? Можете дать советы
13  Программирование / С/C++ / Re: Обнаружение вопроса при запуске команды через "system" или "QProcess::execute" : Декабрь 13, 2019, 10:53
Спасибо за ответ, но у меня не получилось сигналом QProcess::readyReadStandardOutput отследить момент вопроса. Опция -y хорошо помогает, когда надо ответить на вопрос "Да", но мне после вопроса нужно выйти и выдать ошибку (о том, что архив неисправен).
14  Программирование / С/C++ / Обнаружение вопроса при запуске команды через "system" или "QProcess::execute" : Декабрь 12, 2019, 16:57
Здравствуйте.
Я запускаю программу через QProcess::execute. По сути тоже самое, как если бы запустил через терминал командной строки вручную.
Бывает такое, что запускаемая программа "о чем-то спрашивает пользователя". В моем случае я запускаю 7z.exe и если в архиве в одной папке лежат 2 одинаковых файла, то программа спрашивает, что делать ли переименование файла при разархивации.

Можете подсказать, можно как-то отследить в основной программе случай, когда программа запущенная в командной строке "задает вопрос"?
15  Qt / ActiveX / Re: Установка гиперссылок с помощью QAxObject : Октябрь 10, 2019, 10:59
Примерно так
Код:
QAxObject *hLink = testCell->querySubObject("Hyperlinks");
QAxObject *testLink = hLink->querySubObject("Add(QObject,QString,QVariant,QVariant,QVariant)",testCell->asVariant(),"","NameList!A1","aaa","bbb");
Страниц: [1] 2 3 ... 12

Страница сгенерирована за 0.053 секунд. Запросов: 23.