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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 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();

20  Qt / Многопоточное программирование, процессы / Re: waitForDone : Июль 05, 2021, 09:28
Опять-таки, требуется (синхронное) ожидание, а не сигнал.
std::async

PS: ожидание асинхронной задачи с остановкой потока - проблемы в архитектуре (мое имхо)
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 его дернуть в своем потоке.
22  Qt / Многопоточное программирование, процессы / Re: waitForDone : Июль 01, 2021, 14:36
Код:
void ThreadWrapper::threadFunc()
{
    while (!done)
        doWork();
   emit workFinished();
}
23  Qt / OpenGL / Re: Долгое рисование : Июнь 22, 2021, 13:34
Логичным выглядит ограничить время рисования, и если оно истекло И (&&) мышь двинулась - выводим то что успели + обязательный манипулятор.

Вот мы и приходим к тому о чем я толкую: а как "прерываться"? На драге - да, годится. А на регулярном обновлении?
Тогда будут отрисовываться рандомные первые N объектов, будет выглядеть не очень красиво, у пользователя могут возникнуть вопросы, "а где остальное?"
Здесь лучше 2-й вариант подойдет, с "прореживанием" объектов для отрисовки. При регулярном обновлении делать триггер, по которому прерывать отрисовку
24  Qt / OpenGL / Re: Долгое рисование : Июнь 22, 2021, 11:42
Например какой нибудь QCad при перемещении 100500 объектов перемещает только общий для всех boundingBox, сами объекты не рисует при перемещении, ну либо ставит в очередь отрисовки ~раз в секунду.
Другие "прореживают" перемещаемые объекты, берут (к примеру) каждый 10-й, ну либо внутри есть хардкод некоего количества легко перемещаемых объектов, вычисляют коэфф. прореживания, согласно этого хардкода.
25  Программирование / Алгоритмы / Re: Найти дырки : Июнь 09, 2021, 14:31
Вот это не подойдет: https://libspatialindex.org/en/latest/
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();
27  Программирование / Общий / Re: Шарить так и сяк : Май 18, 2021, 10:14
врапер/фабрику по созданию CMotion писать, с индексатором по ключу
28  Qt / Вопросы новичков / Re: Получить указатель на главное окно : Апрель 28, 2021, 10:49
чтобы не вылетало, надо:
1. Проверить условие QApplication::topLevelWidgets().size() > 0
2. Проверить условие nullptr != nw
Если оба условия прошли, можно дальше работать.
29  Программирование / Общий / Re: Ускорить : Апрель 26, 2021, 15:06
А тут имхо лучше построить QMap с чилда на пэрент: QMap<CData*, CData*> childToParentMap
Если данных много, лучше QHash
30  Qt / Вопросы новичков / Re: Как вызываются деструкторы : Апрель 20, 2021, 21:41
Зато сколько кода генеиилось в onButtonClick
Страниц: 1 [2] 3 4 ... 15

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