Перейти к содержанию
    

Использовать класс в других модулях.

Я пишу в 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)!!! - это зло!!!

 

Вопрос - а как тогда пользоваться классом если он не глобальный?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, jenya7 said:

На меня там (в Qt форум) все орут - как ты можешь!!! - нельзя использовать глобальный экземпляр класса (m_telebot)!!! - это зло!!!

Вам можно

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно из-за риска "многопотчного" использования экз-ра класса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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
{
    //юзай объекты с другого потока сколько хочешь                  
});

 

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, jenya7 сказал:

(1) ну вообще то я запускаю несколько потоков. есть вероятность что класс будет использован в разных потоках. что то в таком случае надо предпринять? 

(2) у меня всё это дело в Linux бежит, там наверно своя специфика.

, , , , и ничего. все бежит, конфликтов не происходит. при том что m_sensor.GetDataByValType я вызываю ещё в одном месте.

 

(1) Если весь код свой и "прозрачный" можно еще предполагать, что все работает как задумано. Но что "задумано" внутри Qt . . .  

Цитата

нельзя использовать глобальный экземпляр класса (m_telebot)!!! - это зло!!!

А кроме "низзя" есть какие-то обоснования, или просто ссылка на "табу" в Qt ? Могобыть ейные правила написания интерфейсов. ps - в том числе с учетом IPC.

(2) "Грабли" могут возникать в виде сбоя-глюка, к примеру - раз в неделю, при совпадении нескольких событий.

Отлавливать такое - удовольствие на "большого любителя" :dash2:.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в .NET так не забалуешь, там сразу пробивает на эксепшен...
Ну, слава те госспади, что не на "хавчик" \-8Ж

PS: пардон - не удержался...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/1/2022 at 6:38 PM, k155la3 said:

(1) Если весь код свой и "прозрачный" можно еще предполагать, что все работает как задумано. Но что "задумано" внутри Qt . . .  

А кроме "низзя" есть какие-то обоснования, или просто ссылка на "табу" в Qt ? Могобыть ейные правила написания интерфейсов. ps - в том числе с учетом IPC.

(2) "Грабли" могут возникать в виде сбоя-глюка, к примеру - раз в неделю, при совпадении нескольких событий.

Отлавливать такое - удовольствие на "большого любителя" :dash2:.

они говорят так - либо singleton либо static class. я пользовался и тем и другим и вот хоть убей не понимаю чем это существенно отличается от моего метода.

а что в Linux можно поставить какие то семафоры, мютекс скажем чтоб исключить коллизию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/2/2022 at 2:26 PM, jenya7 said:

они говорят так - либо singleton либо static class. я пользовался и тем и другим и вот хоть убей не понимаю чем это существенно отличается от моего метода.

а что в Linux можно поставить какие то семафоры, мютекс скажем чтоб исключить коллизию?

Используйте QMutex. Так будет кроссплатформенно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/2/2022 at 1:40 PM, dimka76 said:

Используйте QMutex. Так будет кроссплатформенно.

о! спасибо. то что надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/2/2022 at 12:26 PM, jenya7 said:

они говорят так - либо singleton либо static class.

Если у вас один единственный класс, который не с кем не контактирует при создании, то запрет на такой класс - чистое табу (обусловленное заботой о 'чистоте' кода)

Если же у вас несколько статических классов, которые используют друг друга, то это проблема - С++ не гарантирует порядок инициализации статических классов. И вы вполне можете обратится к ещё не созданному классу. Причем можете или нет наступить на эти грабли не так очевидно - во превых классы могут залесть  друг в друга не напрямую, через какую нибудь функцию (и это само по себе не так очевидно), и во вторых в процессе развития программы 1й случай легко может перерости во второй.

 

Синглетоны и статические (с функциях) классы позволяют контролировать порядок своего создания

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...