The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"проблема со статическим мембером и таймером"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"проблема со статическим мембером и таймером"
Сообщение от vvk emailИскать по авторуВ закладки on 04-Мрт-03, 23:17  (MSK)
есть статический мембер в моем классе (MyClass).
я время от времени пускаю setitimer, который по таймауту пускает метод ontimer, который делает что то типа того:

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

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: проблема со статическим мембером и таймером"
Сообщение от Max V. Zinal emailИскать по авторуВ закладки on 08-Мрт-03, 23:05  (MSK)
>есть статический мембер в моем классе (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();

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру