Название: Поток для работы с диском Отправлено: deMax от Май 18, 2013, 15:05 Как наиболее правильно и просто реализовать класс для работы с диском в другом потоке(чтение и сохранение файлов). Когда программа посылает запрос на чтение она продолжает выполняться, и как только файл будет загружен в память она получит указатель на него. Файлов может быть много и они могут долго загружаться, в это время программа будет постоянно обновлять сцену на opengl.
У класса должен быть список задач, для того чтобы прервать все или некоторые задачи, когда класс неипользуется поток не должен нагружать ядро процессора. Название: Re: Поток для работы с диском Отправлено: mutineer от Май 18, 2013, 15:25 Пишешь класс, отправляешь его в QThread и используешь
Название: Re: Поток для работы с диском Отправлено: deMax от Май 18, 2013, 15:31 Тогда такие вопросы, как только класс закончил выполнять действия он останавливается, как только появились новые запросы класс запускается.
Через qtconcurrent это не лучше сделать? Название: Re: Поток для работы с диском Отправлено: mutineer от Май 18, 2013, 15:31 Зачем? Пустой ивент-луп не так чтобы очень сильно CPU грузит, сидит себе и ждет новых событий
Название: Re: Поток для работы с диском Отправлено: deMax от Май 18, 2013, 16:01 Может есть готовый пример? Задача общая для потоков.
Наследование от QThreat в моем случае не красиво. http://habrahabr.ru/post/150274/ Цитировать «Класс QThread создан и предназначен для использования в качестве интерфейса к потокам операционной системы, но не для того, чтобы помещать в него код, предназначенный для выполнения в отдельном потоке. В ООП мы наследуем класс для того чтобы расширить или углубить функциональность базового класса. Единственное оправдание для наследования QThread, которое я могу представить, это добавление такой функциональности, которой в QThread не существует, например, передача указателя на область памяти, которую поток может использовать для своего стека, или, возможно, добавление поддержки интерфейсов реального времени. Загрузка файлов, работа с базами данных, и подобные функции не должны присутствовать в наследуемых классах QThread; они должны реализовываться в других объектах» Для меня красивое решение - это класс A c методом Get(int a, int *b); Я вызываю сколько угодно раз этот очень медленный метод, как только он просчитает значение в другом потоке оно появится в переменной b. Название: Re: Поток для работы с диском Отправлено: mutineer от Май 18, 2013, 16:03 Я не говорил про наследование от QThread, я как раз говорил от него не наследоваться
Название: Re: Поток для работы с диском Отправлено: m_ax от Май 18, 2013, 17:03 Для меня красивое решение - это класс A c методом Get(int a, int *b); Я вызываю сколько угодно раз этот очень медленный метод, как только он просчитает значение в другом потоке оно появится в переменной b. Можно так, например: Код
Название: Re: Поток для работы с диском Отправлено: mutineer от Май 18, 2013, 17:08 Для меня красивое решение - это класс A c методом Get(int a, int *b); Я вызываю сколько угодно раз этот очень медленный метод, как только он просчитает значение в другом потоке оно появится в переменной b. Ну так сделай такой класс со слотом Get(...), который внутри складывает данные в очередь, выбирает из очереди данные и выполняет работу. По окончанию высылает сигнал со значением. А объект этого класса при помощи moveToThread вынеси в отдельный поток. Название: Re: Поток для работы с диском Отправлено: deMax от Май 19, 2013, 14:23 Можно так, например: А это будет работать последовательно если я в цикле запрос сделаю?Код: for(int i=0; i<100; ++i) Примерно так я вижу использование данного класса: Код: Storage storage; Название: Re: Поток для работы с диском Отправлено: m_ax от Май 19, 2013, 18:47 Можно так, например: А это будет работать последовательно если я в цикле запрос сделаю?Код: for(int i=0; i<100; ++i) Не.. так делать не надо.. std::async - запускает функцию в отдельном потоке (если установлен флаг std::launch::async) Всё. Она хороша там, где, например, можно без особых проблем распараллелить какой-нибудь алгоритм. Например, если нужно посчитать интеграл методом Монте Карло или какую-нибудь сумму или.. Ну в общем всё то, что можно разбить на конечное число частей и параллельно их сосчитать. Посмотрите лучше примеры по QThread (раз у вас тут всё на Qt замешано). Название: Re: Поток для работы с диском Отправлено: deMax от Май 22, 2013, 07:27 Мой helloworld
cachedisk.cpp Код: #include "cachedisk.h" cachedisk.h Код: #ifndef CACHEDISK_H main.cpp Код: #include <QApplication> Не отображает картинку, вначале QLabel был в main.cpp, если вызвать метод read без потока то все загружается, если в потоке то не работает, хотя адрес возвращает на картинку. Название: Re: Поток для работы с диском Отправлено: deMax от Май 22, 2013, 11:10 Если заменить
QPixmap *tmpPixmap = new QPixmap(fileName); на QPixmap *tmpPixmap = new QPixmap; qDebug()<<tmpPixmap->load(fileName); то работает для другого потока, а в том же потоке работает и первый вариант. qt выдает предупреждение "QPixmap: It is not safe to use pixmaps outside the GUI thread" стоит использовать QPixmap или перейти на QImage? |