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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 112 113 [114] 115 116 ... 122
1696  Qt / Многопоточное программирование, процессы / Re: QFuture и QtConcurrent удаление потока после завершения фукнции : Сентябрь 09, 2012, 20:09
Значит
Код:
        threadFunc.waitForFinished();
        threadFunc.cancel();

вызов функции в созданном потоке, если предыдущая функция завершилась или создание нового потока?
1697  Qt / Многопоточное программирование, процессы / [РЕШЕНО] QFuture и QtConcurrent удаление потока после завершения фукнции : Сентябрь 09, 2012, 19:59
Здравствуйте! Улыбающийся
Использую QFuture и QtConcurrent для того чтобы функция выполнялась в отдельном потоке и не нагружала главный
Написал тестовый вариант на основе примера QtConcurrent Run Function Example:
Код:
#include <QDebug>
#include <QThread>
#include <QString>
#include <QtConcurrentRun>
#include <QFuture>
#include <QApplication>

class foo
{
public:
    foo(QString str)
    {
        QtConcurrent::run(this, &foo::msg, str);
    }
private:
    void msg(QString name)
    {
        qDebug() << "Hello" << name << "from" << QThread::currentThread();
    }
};

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    foo("Hello World!");
    foo("Hello C++!");
    foo("Hello Qt!");

    app.exec();
}

только вот после выполнения не остается всего 1 поток - главный а весят 4

смотря в документацию изменил конструктор:
Код:
    foo(QString str)
    {
        QFuture <void> threadFunc = QtConcurrent::run(this, &foo::msg, str);
        threadFunc.waitForFinished();
        threadFunc.cancel();
    }
но не все созданные потоки можно закрыть (остаются не закрытыми 2: главный и созданный run), о чем, если я не ошибаюсь написанно в документации

в программе могут использоваться множество раз одни и теже функции:
Код:
void Note::loadDataNote()
{
    QSettings settingsINI(pathIni, QSettings::IniFormat);

    settingsINI.setIniCodec(QTextCodec::codecForName("windows-1251"));

    dataNote.globalPosX       = settingsINI.value("GlobalPosX", 100).toInt();
    dataNote.globalPosY       = settingsINI.value("GlobalPosY", 100).toInt();
    dataNote.width            = settingsINI.value("Width", 200).toInt();
    dataNote.height           = settingsINI.value("Height", 200).toInt();
    dataNote.title            = settingsINI.value("Title", "").toString();
    dataNote.lock             = settingsINI.value("Lock", false).toBool();
    dataNote.text             = settingsINI.value("Text", "").toString();
    dataNote.visible          = settingsINI.value("Visible", true).toBool();
    dataNote.opacityNote      = settingsINI.value("Opacity", 100).toFloat() / 100;
    dataNote.colorNote        = con.getColorFromHexColorForStyleSheet(color);
    dataNote.attribute        = settingsINI.value("Attribute", "Default").toString();
    dataNote.dateOfCreating   = settingsINI.value("DateOfCreating", date).toString();
    dataNote.dateLastChange   = settingsINI.value("DateLastChange", date).toString();
    dataNote.countTextSymbols = settingsINI.value("CountTextSymbols", 0).toInt();
    dataNote.countTextLines   = settingsINI.value("CountTextLines", 1).toInt();
    dataNote.password         = settingsINI.value("Password/Password", "").toString();
    dataNote.protectionActive = settingsINI.value("Password/protectionActive", false).toBool();
}

void Note::saveDataNote()
{
    QSettings settingsINI(pathIni, QSettings::IniFormat);

    settingsINI.setIniCodec(QTextCodec::codecForName("windows-1251"));

    settingsINI.setValue("GlobalPosX",        dataNote.globalPosX);
    settingsINI.setValue("GlobalPosY",        dataNote.globalPosY);
    settingsINI.setValue("Width",             dataNote.width);
    settingsINI.setValue("Height",            dataNote.height);
    settingsINI.setValue("Title",             dataNote.title);
    settingsINI.setValue("Lock",              dataNote.lock);
    settingsINI.setValue("Text",              dataNote.text);
    settingsINI.setValue("Visible",           dataNote.visible);
    settingsINI.setValue("Opacity",           int(dataNote.opacityNote * 100));
    settingsINI.setValue("Color",             color);
    settingsINI.setValue("Attribute",         dataNote.attribute);
    settingsINI.setValue("DateOfCreating",    dataNote.dateOfCreating);
    settingsINI.setValue("DateLastChange",    dataNote.dateLastChange);
    settingsINI.setValue("CountTextSymbols",  dataNote.countTextSymbols);
    settingsINI.setValue("CountTextLines",    dataNote.countTextLines);
    settingsINI.setValue("Password/Password", dataNote.password);
    settingsINI.setValue("Password/protectionActive", dataNote.protectionActive);

    settingsINI.sync();
}

их я и хочу засунуть в потоки, и было бы не красиво иметь в процессе программы несколько сотен потоков

как правильно запустить функцию в отдельном потоке, и после выполнения функции закрыть поток? Улыбающийся
1698  Qt / Пользовательский интерфейс (GUI) / Re: Как узнать когда в QScrollArea не нужны скроллбары : Сентябрь 07, 2012, 16:53
Какой же eventFilter удобный и простой)))

Скинул тестовый-рабочий проект, которые описывал в начале темы,
может кому то и пригодится Улыбающийся
1699  Qt / Пользовательский интерфейс (GUI) / Re: Как узнать когда в QScrollArea не нужны скроллбары : Сентябрь 07, 2012, 16:50
Ну вроде правильно сделал Улыбающийся
по крайней мере работает Улыбающийся
фильтр:
Код:
bool Widget::eventFilter(QObject *object, QEvent *event)
{
    if(object == scrollArea->verticalScrollBar())
    {
        if(event->type() == QEvent::Show)
        {
            slider->show();
            return false;

        }else if(event->type() == QEvent::Hide)
        {
            slider->hide();
            return false;

        }else
        {
            return false;
        }
    }
    return false;
}

Поправьте, если получился быдлокод Улыбающийся
1700  Qt / Пользовательский интерфейс (GUI) / Re: Как узнать когда в QScrollArea не нужны скроллбары : Сентябрь 07, 2012, 16:05
Тем что при исчезновении вертикального скроллбара нужно скрыть виджет не относящийся к QScrollArea, а именно QSlider Улыбающийся
Ну тогда можно следить за видимостью этого вертикального скроллбара через eventFilter().

А можно пример использования фильтра событий для слежения видимости? Улыбающийся
никогда с ним не работал, и в таких случаях обходился наследованием с переопределением и сигналами Улыбающийся
1701  Qt / Пользовательский интерфейс (GUI) / Re: Как узнать когда в QScrollArea не нужны скроллбары : Сентябрь 07, 2012, 08:47
Тем что при исчезновении вертикального скроллбара нужно скрыть виджет не относящийся к QScrollArea, а именно QSlider Улыбающийся
1702  Qt / Пользовательский интерфейс (GUI) / Re: Как узнать когда в QScrollArea не нужны скроллбары : Сентябрь 07, 2012, 06:25
При ресайз евенте?
1703  Qt / Пользовательский интерфейс (GUI) / [РЕШЕНО] Как узнать когда в QScrollArea не нужны скроллбары : Сентябрь 06, 2012, 21:04
Здравствуйте! Улыбающийся
Решил написать для своего проекта виджет-контейнер Улыбающийся
Выглядит просто:
Есть QScrollArea на ней располагается визуальное
Есть ползунок QSlider с 3 состояниями: движение вверх, остановка и движение вниз
а перемещаются виджеты засунутые в QScrollArea
добавил QTimer, и ура! все само перемещается только двигай ползунком или вертикальным скроллом QScrollArea

вот только ползунок надо бы скрывать вместе с вертикальным скроллом QScrollArea, если все виджеты в QScrollArea видны

Сам вопрос:
и как узнать когда в QScrollArea не нужны скроллбары?
и можно пример этого? Улыбающийся
1704  Программирование / Общий / Re: Управление настройками монитора : Сентябрь 06, 2012, 20:41
Так я и думал Грустный
надеялся что и для такой ситуации тролли сделают решение Улыбающийся
1705  Программирование / Общий / Управление настройками монитора : Сентябрь 06, 2012, 20:16
Здравствуйте! Улыбающийся
Можно ли средствами Qt изменять настройки монитора (калибровка, разрешение, яркость и т.д.)?
Если можно, то как?
Если не возможно, то подскажите в какую сторону копать (ос виндоус) Улыбающийся
1706  Qt / Многопоточное программирование, процессы / Re: Использование QFuture и QtConcurrent внутри класса с вызовом метода этого класса : Сентябрь 04, 2012, 18:15
Да не из-за таблицы, я думаю виснет интерфейс, а из-за выделения памяти и создания виджетов, в таблицах ведь каждая строка - один виджет, каждый виджет тратит на себя где-то 0.3мб, а ведь ему еще нужно загрузить еще свои данные, вот и виснет Улыбающийся

Есть вариант создавать эти виджеты в качестве отдельного процесса, но это будет не красиво (да и сработает ли вообще??), представьте если будет этих виджетов 50 или более..

Для ускорения заполнения таблицы попробуй перейти на model/view
Интерфейс виснет уже когда более 20 записей (20 виджетов) в таблице, от перехода ситуацию не изменится Улыбающийся

Можно, конечно, сделать отправление сигналов из потоков в главный поток типа: "Создай такой то виджет", но опять будет виснуть интерфейс...

Отдельные потоки нужны только при загрузке в таблицы, а дальше они не понадобятся, значит надо думать как "облегчить" инициализацию и отрисовку этих виджетов, может какие нибудь действия, не связанные с gui вынести в потоки...
Буду думать...
1707  Qt / Многопоточное программирование, процессы / Re: Использование QFuture и QtConcurrent внутри класса с вызовом метода этого класса : Сентябрь 04, 2012, 18:03
Все разобрался, код такой:
Код:
QFuture <void> threadLoadInTable1 = QtConcurrent::run(this, &MyClass::loadInTable1);
Не знаю почему, писал сначала так:
Код:
QFuture <void> threadLoadInTable1 = QtConcurrent::run(MyClass, &MyClass::loadInTable1);

И потвердил свои сомнения, в консоль выдается такое:
QPixmap: It is not safe to use pixmaps outside the GUI thread
QObject::setParent: Cannot set parent, new parent is in a different thread
1708  Qt / Многопоточное программирование, процессы / Re: Использование QFuture и QtConcurrent внутри класса с вызовом метода этого класса : Сентябрь 04, 2012, 17:55
разве не ссылка указана?
Код:
threadLoadInTable1 = QtConcurrent::run(&MyClass::loadInTable1);
1709  Qt / Многопоточное программирование, процессы / Re: Использование QFuture и QtConcurrent внутри класса с вызовом метода этого класса : Сентябрь 04, 2012, 17:53
У меня пример компилится и работает!
У меня ос windows xp, qt 4.8.0, minGW
1710  Qt / Многопоточное программирование, процессы / Re: Использование QFuture и QtConcurrent внутри класса с вызовом метода этого класса : Сентябрь 04, 2012, 17:52
Читал уважаемый mutineer, и использовал для проверки такой код:

И секцию под названием Using Member Functions, на которую я линку дал, читал? Твой проверочный код к ней отношения не имеет
Я знаю, потому что тоже читал это Улыбающийся

Уважаемый kuzulis, предоставленные вами названия примеров, кроме QtConcurrent Image Scaling Example, не имеют отношения к моему вопросу. Да и в QtConcurrent Image Scaling Example показывают только QFutureWatcher, который вряд ли поможет в решении проблемы
Страниц: 1 ... 112 113 [114] 115 116 ... 122

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