>есть статический мембер в моем классе (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();