URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1455
[ Назад ]

Исходное сообщение
"проблема со статическим мембером и таймером"

Отправлено vvk , 04-Мрт-03 23:17 
есть статический мембер в моем классе (MyClass).
я время от времени пускаю setitimer, который по таймауту пускает метод ontimer, который делает что то типа того:

ontimer() {
  MyClass mc;
  mc.informAboutValue(value);
}

в методе informAboutValue происходит присваивание статическому мемберу. Но когда я из основого инстанса MyClass обращаюсь к этому статическому мемберу - там ноль (ну или значение по умолчанию).

Т.е. вызов ontimer происходит в отдельном трэде и обмен через статический член класса невозможен? фигня... Может есть какой выход?


Содержание

Сообщения в этом обсуждении
"RE: проблема со статическим мембером и таймером"
Отправлено Max V. Zinal , 08-Мрт-03 23:05 
>есть статический мембер в моем классе (MyClass).
>я время от времени пускаю setitimer, который по таймауту пускает метод ontimer,
>который делает что то типа того:
>
>ontimer() {
>  MyClass mc;
>  mc.informAboutValue(value);
>}

Перво-наперво, а не проще ли написать
  static void informAboutValue(int v) {...}
и
  MyClass::informAboutValue(666);
???
А то зачем-то экземпляр городится, зря вызывается
конструктор и т.п.

>
>в методе informAboutValue происходит присваивание статическому мемберу. Но когда я из основого
>инстанса MyClass обращаюсь к этому статическому мемберу - там ноль (ну
>или значение по умолчанию).
>
>Т.е. вызов ontimer происходит в отдельном трэде и обмен через статический член
>класса невозможен? фигня... Может есть какой выход?

Возможен обмен, возможен. Только не надо забывать про необходимость
блокирования операций при параллельном доступе (хотя бы при помощи
простейшего мьютекса). Пример (псевдо-код, без деталей и с использованием
абстрактного мьютекса из несущесмтвующего API):

class TestClass
{
protected:
  // Мьютекс для защиты данных
  static my_mutex_t mtx_;
  // Собственно данные
  static int value_;

public:
  // Запись значения статической переменной
  // Можно пользовать из любого потока в том же процессе
  static void mySetValue(int v)
  {
    my_mutex_lock(&mtx_);
    value_ = v;
    my_mutex_unlock(&mtx_);
  }
  // Чтение значения статической переменной
  // Можно пользовать из любого потока в том же процессе.
  static int myGetValue()
  {
    int tmp;
    my_mutex_lock(&mtx_);
    tmp = value_;
    my_mutex_unlock(&mtx_);
    return tmp;
  }
  // Инициализация статических переменных.
  // Вызывается единожды, например, в начале main()
  static void initStatics()
  {
    value_ = 0;
    my_mutex_init(&mtx_);
  }
  // Деинициализация статических переменных.
  // Вызывается единожды, например, в начале main()
  static void doneStatics()
  {
    value_ = 0;
    my_mutex_done(&mtx_);
  }
};

После инициализации статических переменных можно пользовать
mySetValue и myGetValue для чтения/записи значения параметра.
Значение одно для всех экземпляров класса, для вызова функций
создавать экземпляр не требуется:
   TestClass::mySetValue(666);
   int val = TestClass::myGetValue();