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(); }
их я и хочу засунуть в потоки, и было бы не красиво иметь в процессе программы несколько сотен потоков как правильно запустить функцию в отдельном потоке, и после выполнения функции закрыть поток?
|
|
|
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(). А можно пример использования фильтра событий для слежения видимости? никогда с ним не работал, и в таких случаях обходился наследованием с переопределением и сигналами
|
|
|
1703
|
Qt / Пользовательский интерфейс (GUI) / [РЕШЕНО] Как узнать когда в QScrollArea не нужны скроллбары
|
: Сентябрь 06, 2012, 21:04
|
Здравствуйте! Решил написать для своего проекта виджет-контейнер Выглядит просто: Есть QScrollArea на ней располагается визуальное Есть ползунок QSlider с 3 состояниями: движение вверх, остановка и движение вниз а перемещаются виджеты засунутые в QScrollArea добавил QTimer, и ура! все само перемещается только двигай ползунком или вертикальным скроллом QScrollArea вот только ползунок надо бы скрывать вместе с вертикальным скроллом QScrollArea, если все виджеты в QScrollArea видны Сам вопрос: и как узнать когда в QScrollArea не нужны скроллбары? и можно пример этого?
|
|
|
1705
|
Программирование / Общий / Управление настройками монитора
|
: Сентябрь 06, 2012, 20:16
|
Здравствуйте! Можно ли средствами Qt изменять настройки монитора (калибровка, разрешение, яркость и т.д.)? Если можно, то как? Если не возможно, то подскажите в какую сторону копать (ос виндоус)
|
|
|
1706
|
Qt / Многопоточное программирование, процессы / Re: Использование QFuture и QtConcurrent внутри класса с вызовом метода этого класса
|
: Сентябрь 04, 2012, 18:15
|
Да не из-за таблицы, я думаю виснет интерфейс, а из-за выделения памяти и создания виджетов, в таблицах ведь каждая строка - один виджет, каждый виджет тратит на себя где-то 0.3мб, а ведь ему еще нужно загрузить еще свои данные, вот и виснет Есть вариант создавать эти виджеты в качестве отдельного процесса, но это будет не красиво (да и сработает ли вообще??), представьте если будет этих виджетов 50 или более.. Для ускорения заполнения таблицы попробуй перейти на model/view
Интерфейс виснет уже когда более 20 записей (20 виджетов) в таблице, от перехода ситуацию не изменится Можно, конечно, сделать отправление сигналов из потоков в главный поток типа: "Создай такой то виджет", но опять будет виснуть интерфейс... Отдельные потоки нужны только при загрузке в таблицы, а дальше они не понадобятся, значит надо думать как "облегчить" инициализацию и отрисовку этих виджетов, может какие нибудь действия, не связанные с gui вынести в потоки... Буду думать...
|
|
|
1710
|
Qt / Многопоточное программирование, процессы / Re: Использование QFuture и QtConcurrent внутри класса с вызовом метода этого класса
|
: Сентябрь 04, 2012, 17:52
|
Читал уважаемый mutineer, и использовал для проверки такой код:
И секцию под названием Using Member Functions, на которую я линку дал, читал? Твой проверочный код к ней отношения не имеет Я знаю, потому что тоже читал это Уважаемый kuzulis, предоставленные вами названия примеров, кроме QtConcurrent Image Scaling Example, не имеют отношения к моему вопросу. Да и в QtConcurrent Image Scaling Example показывают только QFutureWatcher, который вряд ли поможет в решении проблемы
|
|
|
|
|