jenya7 0 1 сентября, 2022 Опубликовано 1 сентября, 2022 (изменено) · Жалоба Я пишу в Qt и там пользую С++. Не потому что я так уж хочу, просто многие библиотеки под Qt написаны в плюсах и я следую за ними. Столкнулся с такой проблемой. Например такой класс telebot.h class telebot : public QObject { Q_OBJECT public: telebot(QObject *parent = nullptr); void Start(QString api_key); int IsBotAive(); void SendText(QString message_id, QString text); public slots: void NewMessage(TelegramBotUpdate message); }; extern telebot m_telebot; telebot.cpp telebot m_telebot; static TelegramBot *bot = nullptr; telebot::telebot(QObject *parent) : QObject(parent) { } void telebot::Start(QString api_key) { bot = new TelegramBot(api_key); QObject::connect(bot, &TelegramBot::newMessage, this, &telebot::NewMessage); bot->startMessagePulling(); } //и так далее теперь скажем в main.cpp #include "telebot.h" int main(int argc, char *argv[]) { QFuture<uint32_t> discovered; QApplication a(argc, argv); MainWindow w; w.show(); QtConcurrent::run(&SetupRun); m_telebot.Start(sys_params.bot_api_key); m_telebot.SendText((sys_params.bot_chat_id, "Control board is connected"); } В чём проблема? На меня там (в Qt форум) все орут - как ты можешь!!! - нельзя использовать глобальный экземпляр класса (m_telebot)!!! - это зло!!! Вопрос - а как тогда пользоваться классом если он не глобальный? Изменено 1 сентября, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 1 сентября, 2022 Опубликовано 1 сентября, 2022 · Жалоба 2 hours ago, jenya7 said: На меня там (в Qt форум) все орут - как ты можешь!!! - нельзя использовать глобальный экземпляр класса (m_telebot)!!! - это зло!!! Вам можно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 1 сентября, 2022 Опубликовано 1 сентября, 2022 · Жалоба On 9/1/2022 at 12:49 PM, xvr said: Вам можно а кому нельзя? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 1 сентября, 2022 Опубликовано 1 сентября, 2022 · Жалоба Возможно из-за риска "многопотчного" использования экз-ра класса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 1 сентября, 2022 Опубликовано 1 сентября, 2022 (изменено) · Жалоба On 9/1/2022 at 2:55 PM, k155la3 said: Возможно из-за риска "многопотчного" использования экз-ра класса. ну вообще то я запускаю несколько потоков. есть вероятность что класс будет использован в разных потоках. что то в таком случае надо предпринять? у меня всё это дело в Linux бежит, там наверно своя специфика. ну вот к примеру я в мэйне запускаю поток QtConcurrent::run(&ScriptRun); в самом модуле я обращаюсь к объекту из мэйнового потока val = m_sensor.GetDataByValType(u8_num, SENS_VAL_TYPE_TEMP); и ничего. все бежит, конфликтов не происходит. при том что m_sensor.GetDataByValType я вызываю ещё в одном месте. в .NET так не забалуешь, там сразу пробивает на эксепшен, но там это решается просто Invoke((MethodInvoker)delegate { //юзай объекты с другого потока сколько хочешь }); Изменено 1 сентября, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 1 сентября, 2022 Опубликовано 1 сентября, 2022 · Жалоба 3 часа назад, jenya7 сказал: (1) ну вообще то я запускаю несколько потоков. есть вероятность что класс будет использован в разных потоках. что то в таком случае надо предпринять? (2) у меня всё это дело в Linux бежит, там наверно своя специфика. , , , , и ничего. все бежит, конфликтов не происходит. при том что m_sensor.GetDataByValType я вызываю ещё в одном месте. (1) Если весь код свой и "прозрачный" можно еще предполагать, что все работает как задумано. Но что "задумано" внутри Qt . . . Цитата нельзя использовать глобальный экземпляр класса (m_telebot)!!! - это зло!!! А кроме "низзя" есть какие-то обоснования, или просто ссылка на "табу" в Qt ? Могобыть ейные правила написания интерфейсов. ps - в том числе с учетом IPC. (2) "Грабли" могут возникать в виде сбоя-глюка, к примеру - раз в неделю, при совпадении нескольких событий. Отлавливать такое - удовольствие на "большого любителя" . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 1 сентября, 2022 Опубликовано 1 сентября, 2022 · Жалоба в .NET так не забалуешь, там сразу пробивает на эксепшен... Ну, слава те госспади, что не на "хавчик" \-8Ж PS: пардон - не удержался... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 сентября, 2022 Опубликовано 2 сентября, 2022 · Жалоба On 9/1/2022 at 6:38 PM, k155la3 said: (1) Если весь код свой и "прозрачный" можно еще предполагать, что все работает как задумано. Но что "задумано" внутри Qt . . . А кроме "низзя" есть какие-то обоснования, или просто ссылка на "табу" в Qt ? Могобыть ейные правила написания интерфейсов. ps - в том числе с учетом IPC. (2) "Грабли" могут возникать в виде сбоя-глюка, к примеру - раз в неделю, при совпадении нескольких событий. Отлавливать такое - удовольствие на "большого любителя" . они говорят так - либо singleton либо static class. я пользовался и тем и другим и вот хоть убей не понимаю чем это существенно отличается от моего метода. а что в Linux можно поставить какие то семафоры, мютекс скажем чтоб исключить коллизию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 2 сентября, 2022 Опубликовано 2 сентября, 2022 · Жалоба On 9/2/2022 at 2:26 PM, jenya7 said: они говорят так - либо singleton либо static class. я пользовался и тем и другим и вот хоть убей не понимаю чем это существенно отличается от моего метода. а что в Linux можно поставить какие то семафоры, мютекс скажем чтоб исключить коллизию? Используйте QMutex. Так будет кроссплатформенно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 4 сентября, 2022 Опубликовано 4 сентября, 2022 · Жалоба On 9/2/2022 at 1:40 PM, dimka76 said: Используйте QMutex. Так будет кроссплатформенно. о! спасибо. то что надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 5 сентября, 2022 Опубликовано 5 сентября, 2022 · Жалоба On 9/2/2022 at 12:26 PM, jenya7 said: они говорят так - либо singleton либо static class. Если у вас один единственный класс, который не с кем не контактирует при создании, то запрет на такой класс - чистое табу (обусловленное заботой о 'чистоте' кода) Если же у вас несколько статических классов, которые используют друг друга, то это проблема - С++ не гарантирует порядок инициализации статических классов. И вы вполне можете обратится к ещё не созданному классу. Причем можете или нет наступить на эти грабли не так очевидно - во превых классы могут залесть друг в друга не напрямую, через какую нибудь функцию (и это само по себе не так очевидно), и во вторых в процессе развития программы 1й случай легко может перерости во второй. Синглетоны и статические (с функциях) классы позволяют контролировать порядок своего создания Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться