Просмотр сообщений
|
Страниц: 1 2 3 [4] 5 6 ... 58
|
46
|
Qt / Многопоточное программирование, процессы / Re: Глобальная переменная в потоках
|
: Декабрь 23, 2022, 13:28
|
Уточню. если достоверность profilerIsActive не сильно важна, то мутекс вообще можно убрать
Нельзя. Потому что одновременная запись - это, как уже сказано, UB. Неопределенность я понимаю в широком смысле: если несколько потоков пишут туда true, то состояние переменной может оказаться каким угодно, например, false (хотя откуда оно там возьмется? ). А вот при чтении, в моем конкретном случае, UB не сильно беспокоит. Ну один раз я прочту не то, что на самом деле должно быть в переменной, это приведет к тому, что либо будет пропущен сигнал или, наоборот, будет эмитирован лишний. Именно в моей задаче это не принципиально. Спасибо всем.
|
|
|
49
|
Qt / Многопоточное программирование, процессы / [Решено] Глобальная переменная в потоках
|
: Декабрь 22, 2022, 10:01
|
Коллеги, вопрос про азы многопотокового программирования. Думаю, что ответ простой и очевидный )) Есть глобальная булевая переменная COptions::profilerIsActive. Переменная может изменяться из разных потоков с использованием мьютекса, например: C++ (Qt) { QMutexLocker locker(&mutex); COptions::profilerIsActive = true; ... }
Она используется в качестве флага для эмитирования сигнала вот так, без блокировки: C++ (Qt) if(COptions::profilerIsActive) { emit profilerSig(1, vars.unitId, requestId, QDateTime::currentMSecsSinceEpoch(), vars.hasError(), queueLength()); }
Вопрос: если в момент чтения переменной выполняется ее изменение, может ли это привести к краху программы? То, что я могу прочитать недостоверное значение, меня не волнует - на следующем цикле прочту истинное значение и запущу или остановлю испускание сигнала.
|
|
|
50
|
Qt / Многопоточное программирование, процессы / Re: Класс для запуска и управления несколькими потоками
|
: Декабрь 08, 2022, 14:07
|
Единственное у меня вопрос, у меня клиент запускается в потоке, клиент создает сокет и кидает потоку который уже организовывает конект.
Не понял про "кидает" и про "коннект". Попробуйте это сформулировать другим языком, используя терминологию Qt. Если же вы имеете в виду соединение сигнал-слот, то его правильнее осуществлять в клиенте. И как понимаю методы read и write должны быть реализованы в классе самого потоке не в классе клиента? Но вот когда поток я создаю для него то метод run overload запускается автоматом а мне надо так чтобы после какого то действия в приложении.
Что за read, write? Это обработчики сокета? Судя по всему, вы наследуете QThread. Это не очень хороший способ использования потока. Я вам дал пример, в котором нужный объект передается объекту потока, а запуск выполнения потока вы можете осуществлять, когда вам нужно.
|
|
|
51
|
Qt / Многопоточное программирование, процессы / Re: Класс для запуска и управления несколькими потоками
|
: Декабрь 04, 2022, 13:17
|
Эти сигналы (servicePollingSig, serviceArchiveSig и т.д.) я оставил для примера, чтобы вы помнили, что межпотоковое взаимодействие осуществляется, как правило, с помощью этого механизма. В моем случае объекты polling, archiving и т.д. выполняют каждый свою задачу (опрос устройств, создание долговременного архива данных и т.д.), работают каждый со своей периодичностью по таймеру. Поскольку таймер должен создаваться в том потоке, в котором он работает, то для запуска используются упомянутые выше сигналы. Вызываются они тогда, когда это нужно по ходу выполнения программы. Например, у меня - при запуске сервера, после того, как все объекты созданы, распиханы по потокам, прочтена конфигурация: C++ (Qt) void CCoreServer::startServices() { ... if(COptions::autoPolling) emit servicePollingSig(true); else qInfo("CoreServer: service of polling disabled."); if(COptions::autoArchiving) emit serviceArchiveSig(true); ...
Если ваши классы что-то там делают, а результат их деятельности (например, какие-нибудь данные) потребляются в каком-нибудь другом потоке, то придется создать еще одно соединение сигнал-слот, через которое будете отдавать эти данные. Если эти данные будут представлять собой объекты каких-нибудь ваших классов, то эти классы нужно будет зарегистрировать в метаобъектной системе Qt, например, так: C++ (Qt) Q_DECLARE_METATYPE(CRequestArgs) ... { if(!QMetaType::isRegistered(QMetaType::type("CRequestArgs"))) qRegisterMetaType <CRequestArgs> ("CRequestArgs"); ...
В общем, там еще очень много интересного Поэтому присматривайтесь к сообщениям компилятора. ЗЫ Не стоит злоупотреблять цитированием сообщений, тем более, когда это и не требуется, - это плохой тон))
|
|
|
52
|
Qt / Многопоточное программирование, процессы / Re: Класс для запуска и управления несколькими потоками
|
: Декабрь 03, 2022, 21:52
|
Например, так: C++ (Qt) class CCoreServer : public QObject { Q_OBJECT private:private: CServicePolling polling; CServiceArchives archiving; CServiceRules rules; CServiceTransmit transmission; QThread pollingThread; QThread archivingThread; QThread ruleThread; QThread transmissionThread; ... CCoreServer::CCoreServer(QObject *parent) : QObject(parent), polling(this), archiving(this), rules(this), transmission(this) { ... polling.moveToThread(&pollingThread); QObject::connect(this, &CCoreServer::servicePollingSig, &polling, &CServicePolling::serviceRunSlot, Qt::BlockingQueuedConnection); pollingThread.setObjectName("polling"); pollingThread.start(QThread::HighPriority); qInfo ("Polling thread started."); archiving.moveToThread(&archivingThread); QObject::connect(this, &CCoreServer::serviceArchiveSig, &archiving, &CServiceArchives::serviceRunSlot, Qt::BlockingQueuedConnection); archivingThread.setObjectName("archiving"); archivingThread.start(); qInfo ("Archiving thread started."); rules.moveToThread(&ruleThread); QObject::connect(this, &CCoreServer::serviceRuleSig, &rules, &CServiceRules::serviceRunSlot, Qt::BlockingQueuedConnection); QObject::connect(this, &CCoreServer::loadRuleSig, &rules, &CServiceRules::loadRulesSlot); ruleThread.setObjectName("rules"); ruleThread.start(); qInfo ("Rules thread started."); transmission.moveToThread(&transmissionThread); QObject::connect(this, &CCoreServer::serviceTransmissionSig, &transmission, &CServiceTransmit::serviceRunSlot, Qt::BlockingQueuedConnection); transmissionThread.setObjectName("transmission"); transmissionThread.start(QThread::LowPriority); qInfo ("Transmission thread started.");
|
|
|
59
|
Qt / Общие вопросы / Re: Размер программы в Qt
|
: Ноябрь 08, 2022, 22:52
|
Честно, не понял, чем мне это может помочь Вот если бы вы написали, что 3 Мб - это так, ерунда, а 5 - уже много, то я бы знал, к чему стремиться
|
|
|
60
|
Qt / Общие вопросы / Re: Размер программы в Qt
|
: Ноябрь 08, 2022, 14:29
|
3 МБ нынче много? или это встраиваемые системы, где каждый КБ на счету? Если б это была встраиваемая система, вопроса бы не возникло. Видимо, у меня рефлекс с времен dos 3.0 Но, в общем, посыл я понял.
|
|
|
|
|