LINUX.ORG.RU

[Q] XFree - событие NoEvent - целесообразность генерации


0

0

Всем привет! Для эмуляции автоповтора при удерживании клавиши мыши я генерирую событие NoEvent. Генерирую так - если по select() за определенный промежуток времени нет события и клавиша мыши нажата - вернуть событие NoEvent. Теперь вопрос: мне надо динамически обновлять окно. Чем чревата генерация NoEvent на регулярной основе?


offtopic

offtopic: А что, если добавить еще файл-дескриптор и говорить по нему?
Но может просто вызывать обработчик после возврата select по таймауту? 

yaroslav_v
()
Ответ на: offtopic от yaroslav_v

>Но может просто вызывать обработчик после возврата select по таймауту? В принципе это реально, но не хотелось бы нагружать конструктор, поскольку события выбираются и частично генерятся в нем. А может можно как-то периодически посылать сигнал и в обработчике сигнала сделать перерисовку окна? В окне я держу дерево процессов и мне неободимо ргулярно обновлять его.

mav
() автор топика

pipes

int fd[2]; fd=pipe();
select( /*XConnection, fd[0]*/ );
if(/* fd[0] has data*/) {
 /* redraw_callback */
} else {
  /* Process XEvent */
}
void timeout_signal()
{
 char dummy;
 write(fd[1],&dummy,1);
}

P.S. Я скачаю твою работу и напишу конкретнее.

P.P.S. Решение с трубами работать должно, но похоже оно слишком
расточительно.
Видимо
проще добавить поддержку timeout в библиотеку и если timeout_callback(s)
установлены просить, чтобы select вернулась не позже ближайшего timeout. 

yaroslav_v
()
Ответ на: pipes от yaroslav_v

Спасибо Ярослав!
Я очень благодарен тебе за помощь и поддержку.
25.11.1999 выложу новую версию, с исправленными ошибками.

mav
() автор топика

oldtopic

О memory:

extern int allocated; // global variable
int allocated=0;

/*
 We hold a size of the block in first sizeof(int) bytes
 so we do not rely on system\'s free() realization
*/
inline void* d_malloc(size_t n)
{
 allocated+=n;
 char *p=malloc(n+sizeof(int));
 *(int*)p=n;
 return p+sizeof(int);
}

inline void* d_free(void* v)
{
 char *p=(char*)v - sizeof(int);
 allocated-=*(int*)p;
 free(p);
}

// Redefine new and delete operators
class Base_Object { // Если есть .....
public:
// .....
 void* operator new(int n) { return d_malloc(n); };
 operator delete(void* v) { d_free(v); };
};

#ifdef DEBUG
//
#     define malloc d_malloc // plase it after d_malloc definition
#     define free d_free // plase it after d_free definition
#endif

int main()
{
 /* ..... */
 sprintf(stderr, "Left: %d\n", allocated);
}

/* exit_handler,etc. ..... */ 

yaroslav_v
()
Ответ на: oldtopic от yaroslav_v

Ого! Пожалуй я использую это.
Кстати, думаю такой метод отладки пригодился бы многим.
Спасибо.

mav
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.