Просмотр сообщений
|
Страниц: 1 [2] 3 4 ... 15
|
16
|
Qt / Многопоточное программирование, процессы / Re: waitForDone
|
: Июль 07, 2021, 11:19
|
Кстати есои мы уж так идейны/принципиальны - то давайте заодно рассмотрим и асинхронный вариант, для него ведь тоже решений не видно (пока)
void MainThreadWorker::onFinishShadowThread() { emit workShadowThread(/* work params */) }
|
|
|
17
|
Qt / Многопоточное программирование, процессы / Re: waitForDone
|
: Июль 07, 2021, 09:17
|
Потому что поток стоит, а мог бы работать. Да и проц нечего экономить, пусть трудится.
Ну поток не грузовик, он когда не работает, дорогу не занимает) Тем более в это время другие потоки шуруют во всю, если надо. ОС контексты потоков все равно переключает, ей не важно спит он или нет.
|
|
|
18
|
Qt / Многопоточное программирование, процессы / Re: waitForDone
|
: Июль 06, 2021, 19:29
|
А что не так со слипом в цикле? Слип останавливает поток на некоторое время, ресурсы проца не жрутся. Не вижу, почему это плохо Потому что поток стоит, а мог бы работать. Да и проц нечего экономить, пусть трудится.
|
|
|
19
|
Qt / Многопоточное программирование, процессы / Re: waitForDone
|
: Июль 06, 2021, 13:44
|
С применением std & boost, но принцип будет понятен: std::string fullConfig; std::condition_variable waiter; auto configHandler = [&waiter](const std::string& configStr, bool) { fullConfig = configStr; waiter.notify_all(); };
boost::asio::io_context ctx; ConfigReaderWorker worker(ctx, settings, configHandler); std::thread configThread = std::thread(std::bind([&ctx](){ctx.run();}));
std::mutex locker; std::unique_lock lock(locker); waiter.wait_for(lock, []{return !fullConfig.empty();});
worker.stop(); ctx.stop();
|
|
|
21
|
Qt / Многопоточное программирование, процессы / Re: waitForDone
|
: Июль 03, 2021, 19:06
|
void ThreadWrapper::threadFunc() { while (!done) doWork(); emit workFinished(); } Здесь нет ожидания задачи, т.е. этот код годится для параллельного выполнения только одной, потом надо нитку перезапускать. Гораздо удобнее то что предлагает Qt по умоочанию: создать QThread и сделать start. Нитка войдет в свой событийный цикл (exec). Теперь можно подкармливать ее задачами просто посылая ей сигналы (QueuedConnection). Как не раз жевалось в прошлом, лучше/грамотнее пулять сигналами не самой нитке, а "воркеру". Вот. Теперь (стартовый пост) надо дождаться когда рабочая нитка сделает все свои текущие дела - не путать с завершением. С чего вдруг перезапускать? ThreadWrapper::moveToThread в конструкторе и будет постоянно крутиться в отдельном своем потоке. А ThreadWrapper::threadFunc() это либо слот, либо через invokeMethod его дернуть в своем потоке.
|
|
|
23
|
Qt / OpenGL / Re: Долгое рисование
|
: Июнь 22, 2021, 13:34
|
Логичным выглядит ограничить время рисования, и если оно истекло И (&&) мышь двинулась - выводим то что успели + обязательный манипулятор.
Вот мы и приходим к тому о чем я толкую: а как "прерываться"? На драге - да, годится. А на регулярном обновлении?
Тогда будут отрисовываться рандомные первые N объектов, будет выглядеть не очень красиво, у пользователя могут возникнуть вопросы, "а где остальное?" Здесь лучше 2-й вариант подойдет, с "прореживанием" объектов для отрисовки. При регулярном обновлении делать триггер, по которому прерывать отрисовку
|
|
|
24
|
Qt / OpenGL / Re: Долгое рисование
|
: Июнь 22, 2021, 11:42
|
Например какой нибудь QCad при перемещении 100500 объектов перемещает только общий для всех boundingBox, сами объекты не рисует при перемещении, ну либо ставит в очередь отрисовки ~раз в секунду. Другие "прореживают" перемещаемые объекты, берут (к примеру) каждый 10-й, ну либо внутри есть хардкод некоего количества легко перемещаемых объектов, вычисляют коэфф. прореживания, согласно этого хардкода.
|
|
|
26
|
Qt / Базы данных / Re: Как создать файл с БД SQLite из-под приложения?
|
: Май 28, 2021, 11:36
|
Создаем пустой файл: if (!std::filesystem::exists(DbFile.toStdString())) std::ifstream file(DbFile.toStdString(), std::ios_base::in); Создаем структуру БД. CreateDB - вектор с SQL на создание таблиц, индексов и прочей предварительной инициализации. auto сonnection = QSqlDatabase::addDatabase("QSQLITE", "SomeDatabase"); connection.setDatabaseName(DbFile); bool isOpened = connection.open(); if (!isOpened) return; connection.transaction(); for (auto& createSQL : CreateDB) connection.exec(createSQL); connection.commit();
|
|
|
29
|
Программирование / Общий / Re: Ускорить
|
: Апрель 26, 2021, 15:06
|
А тут имхо лучше построить QMap с чилда на пэрент: QMap<CData*, CData*> childToParentMap
Если данных много, лучше QHash
|
|
|
Страниц: 1 [2] 3 4 ... 15
|
|
|