Есть Timer без окна?
От: Constructor  
Дата: 16.10.02 12:22
Оценка:
Здравствуйте!
Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну.
А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?
Re: Есть Timer без окна?
От: Flea  
Дата: 16.10.02 12:33
Оценка:
Здравствуйте Constructor, Вы писали:

C>Здравствуйте!

C>Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну.
C>А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?
Пиши 0 вместо указателя на окно
Re: Есть Timer без окна?
От: Joker3D Россия http://blog.trunin.com
Дата: 16.10.02 12:55
Оценка:
Здравствуйте Constructor, Вы писали:

C>Здравствуйте!

C>Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну.
C>А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?

создай окно. (см. VCL'евский TTimer)
Konstantin Trunin
http://blog.trunin.com — эффективное управление людьми, проектами, собой
Re[2]: Есть Timer без окна?
От: Constructor  
Дата: 16.10.02 13:19
Оценка:
Здравствуйте Flea, Вы писали:

F>Здравствуйте Constructor, Вы писали:


C>>Здравствуйте!

C>>Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну.
C>>А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?

F>Пиши 0 вместо указателя на окно


Вообще-то, я использую CWnd::SetTimer. Мой класс наследован от CWnd. Окно создавать (т.е., вызвать Create как обычно делается) для него я не могу. Вываливается на ASSERT, что мой класс не окно.
Следуя Вашему совету, решил написать ::SetTimer(0, 1, 100, ). А что писать в 4-й параметр? NULL теперь туда писать нельзя, а то будет посылаться сообщение WM_TIMER, окна ведь нет. Пишу ::SetTimer(0, 1, 100, TimerProc1), где TIMERPROC TimerProc1(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); Так не хочет компилироваться.( Как вызывать ::SetTimer?
Re[3]: Есть Timer без окна?
От: akela  
Дата: 16.10.02 13:28
Оценка:
Здравствуйте Constructor, Вы писали:

C>Здравствуйте Flea, Вы писали:


C>Вообще-то, я использую CWnd::SetTimer. Мой класс наследован от CWnd. Окно создавать (т.е., вызвать Create как обычно делается) для него я не могу. Вываливается на ASSERT, что мой класс не окно.

C>Следуя Вашему совету, решил написать ::SetTimer(0, 1, 100, ). А что писать в 4-й параметр? NULL теперь туда писать нельзя, а то будет посылаться сообщение WM_TIMER, окна ведь нет.

Можно писать NULL, будет посылаться сообщение WM_TIMER потоку, т.е. такое, что msg.hwnd == NULL
Пишу ::SetTimer(0, 1, 100, TimerProc1), где TIMERPROC TimerProc1(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); Так не хочет компилироваться.(

А как ругается?
Re[4]: Есть Timer без окна?
От: Constructor  
Дата: 16.10.02 13:34
Оценка:
Здравствуйте akela, Вы писали:

A>Здравствуйте Constructor, Вы писали:


C>>Здравствуйте Flea, Вы писали:


C>>Вообще-то, я использую CWnd::SetTimer. Мой класс наследован от CWnd. Окно создавать (т.е., вызвать Create как обычно делается) для него я не могу. Вываливается на ASSERT, что мой класс не окно.

C>>Следуя Вашему совету, решил написать ::SetTimer(0, 1, 100, ). А что писать в 4-й параметр? NULL теперь туда писать нельзя, а то будет посылаться сообщение WM_TIMER, окна ведь нет.

A>Можно писать NULL, будет посылаться сообщение WM_TIMER потоку, т.е. такое, что msg.hwnd == NULL


То есть, если в моем классе объявить обработчик ON_WM_TIMER(), то даже если нет окна, функция OnTimer будет вызываться в нужные моменты?

A>Пишу ::SetTimer(0, 1, 100, TimerProc1), где TIMERPROC TimerProc1(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); Так не хочет компилироваться.(


A>А как ругается?

error C2664: 'SetTimer' : cannot convert parameter 4 from 'void (__stdcall *(struct HWND__ *,unsigned int,unsigned long,unsigned long))(struct HWND__ *,unsigned int,unsigned int,unsigned long)' to 'vo

TimerProc1 объявлена в классе.
Re[5]: Есть Timer без окна?
От: akela  
Дата: 16.10.02 13:59
Оценка:
Здравствуйте Constructor, Вы писали:

C>То есть, если в моем классе объявить обработчик ON_WM_TIMER(), то даже если нет окна, функция OnTimer будет вызываться в нужные моменты?


А что за класс, от чего унаследован?

C>TimerProc1 объявлена в классе.

В классе ее объявлять нельзя. Разве что только как статическую функцию. А как ты ее объявляешь?
Re[3]: Есть Timer без окна?
От: Joker3D Россия http://blog.trunin.com
Дата: 16.10.02 14:02
Оценка:
Здравствуйте Constructor, Вы писали:

C>Здравствуйте Flea, Вы писали:


F>>Здравствуйте Constructor, Вы писали:


C>>>Здравствуйте!

C>>>Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну.
C>>>А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?

F>>Пиши 0 вместо указателя на окно


C>Вообще-то, я использую CWnd::SetTimer. Мой класс наследован от CWnd. Окно создавать (т.е., вызвать Create как обычно делается) для него я не могу. Вываливается на ASSERT, что мой класс не окно.

C>Следуя Вашему совету, решил написать ::SetTimer(0, 1, 100, ). А что писать в 4-й параметр? NULL теперь туда писать нельзя, а то будет посылаться сообщение WM_TIMER, окна ведь нет. Пишу ::SetTimer(0, 1, 100, TimerProc1), где TIMERPROC TimerProc1(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); Так не хочет компилироваться.( Как вызывать ::SetTimer?

напиши попобробнее... почему это ты не можешь создать окно? что за ассерт, где???
Konstantin Trunin
http://blog.trunin.com — эффективное управление людьми, проектами, собой
Re[6]: Есть Timer без окна?
От: Constructor  
Дата: 16.10.02 14:14
Оценка:
Здравствуйте akela, Вы писали:

A>Здравствуйте Constructor, Вы писали:


C>>То есть, если в моем классе объявить обработчик ON_WM_TIMER(), то даже если нет окна, функция OnTimer будет вызываться в нужные моменты?


A>А что за класс, от чего унаследован?


C>>TimerProc1 объявлена в классе.

A>В классе ее объявлять нельзя. Разве что только как статическую функцию. А как ты ее объявляешь?

У меня вот так:
class COutControlCtrl : public COleControl
{
//...
private:
    TIMERPROC TimerProc1(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
}

А как тогда правильно написать?
Re[4]: Есть Timer без окна?
От: Constructor  
Дата: 16.10.02 14:19
Оценка:
Здравствуйте Joker3D, Вы писали:

JD>Здравствуйте Constructor, Вы писали:


C>>Здравствуйте Flea, Вы писали:


F>>>Здравствуйте Constructor, Вы писали:


C>>>>Здравствуйте!

C>>>>Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну.
C>>>>А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?

F>>>Пиши 0 вместо указателя на окно


C>>Вообще-то, я использую CWnd::SetTimer. Мой класс наследован от CWnd. Окно создавать (т.е., вызвать Create как обычно делается) для него я не могу. Вываливается на ASSERT, что мой класс не окно.

C>>Следуя Вашему совету, решил написать ::SetTimer(0, 1, 100, ). А что писать в 4-й параметр? NULL теперь туда писать нельзя, а то будет посылаться сообщение WM_TIMER, окна ведь нет. Пишу ::SetTimer(0, 1, 100, TimerProc1), где TIMERPROC TimerProc1(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); Так не хочет компилироваться.( Как вызывать ::SetTimer?

JD>напиши попобробнее... почему это ты не можешь создать окно? что за ассерт, где???



class COutControlCtrl : public COleControl
{
// ...
}


Окно не могу из-за специфического использования этого класса. Теоретически я могу вызвать Create (она объявлена еще в CWnd), но мне это не нужно. А вылетало на ASSERT( IsWindow() ); (примерно так, точный текст не помню), потому что я окно не создавал. Этот ASSERT где-то в исходниках CWnd. Экземпляр класса оператормо new создавал, а окно для этого класса не создавал, поэтому-то и возник данный вопрос.
Re[5]: Есть Timer без окна?
От: Joker3D Россия http://blog.trunin.com
Дата: 16.10.02 14:28
Оценка:
Здравствуйте Constructor, Вы писали:

C>Здравствуйте Joker3D, Вы писали:


JD>>Здравствуйте Constructor, Вы писали:


C>>>Здравствуйте Flea, Вы писали:


F>>>>Здравствуйте Constructor, Вы писали:


C>>>>>Здравствуйте!

C>>>>>Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну.
C>>>>>А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?

F>>>>Пиши 0 вместо указателя на окно


C>>>Вообще-то, я использую CWnd::SetTimer. Мой класс наследован от CWnd. Окно создавать (т.е., вызвать Create как обычно делается) для него я не могу. Вываливается на ASSERT, что мой класс не окно.

C>>>Следуя Вашему совету, решил написать ::SetTimer(0, 1, 100, ). А что писать в 4-й параметр? NULL теперь туда писать нельзя, а то будет посылаться сообщение WM_TIMER, окна ведь нет. Пишу ::SetTimer(0, 1, 100, TimerProc1), где TIMERPROC TimerProc1(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); Так не хочет компилироваться.( Как вызывать ::SetTimer?

JD>>напиши попобробнее... почему это ты не можешь создать окно? что за ассерт, где???


C>

C>
C>class COutControlCtrl : public COleControl
C>{
C>// ...
C>}
C>


C>Окно не могу из-за специфического использования этого класса. Теоретически я могу вызвать Create (она объявлена еще в CWnd), но мне это не нужно. А вылетало на ASSERT( IsWindow() ); (примерно так, точный текст не помню), потому что я окно не создавал. Этот ASSERT где-то в исходниках CWnd. Экземпляр класса оператормо new создавал, а окно для этого класса не создавал, поэтому-то и возник данный вопрос.


не понимаю, зачем наследоваться от окна если его (окно) не создавать??? (возможно, тут ошибка в дизайне)
ну да ладно,
1. можно создать внутри твоего класса экземпляр окна CMyWnd wnd; со ссылкой на себя,
потом создать само окно wnd.Create(..).
и у него в обработчике ON_TIMER дергать какой-нибудь свой метод...
2. статическую функцию : static TIMERPROC MyTimer(...) и в ней делать то что надо..
Konstantin Trunin
http://blog.trunin.com — эффективное управление людьми, проектами, собой
Re[6]: Есть Timer без окна?
От: Constructor  
Дата: 16.10.02 14:34
Оценка:
Здравствуйте Joker3D, Вы писали:

JD>не понимаю, зачем наследоваться от окна если его (окно) не создавать??? (возможно, тут ошибка в дизайне)


Потому что в COleControl кроме функциональности окна еще очень много полезного, в частности, функциональность внутризадачного СОМ-сервера.

JD>2. статическую функцию : static TIMERPROC MyTimer(...) и в ней делать то что надо..


А теперь я попрошу поподробнее
1. Почему она должна быть статической?
2. Зачем у нее объявили 2-й параметр UINT uMsg, // WM_TIMER message, если туда все равно передается сообщение WM_TIMER?
Re[7]: Есть Timer без окна?
От: Joker3D Россия http://blog.trunin.com
Дата: 16.10.02 14:41
Оценка:
Здравствуйте Constructor, Вы писали:

C>Здравствуйте Joker3D, Вы писали:


JD>>не понимаю, зачем наследоваться от окна если его (окно) не создавать??? (возможно, тут ошибка в дизайне)


C>Потому что в COleControl кроме функциональности окна еще очень много полезного, в частности, функциональность внутризадачного СОМ-сервера.


JD>>2. статическую функцию : static TIMERPROC MyTimer(...) и в ней делать то что надо..


C>А теперь я попрошу поподробнее

C>1. Почему она должна быть статической?
C>2. Зачем у нее объявили 2-й параметр UINT uMsg, // WM_TIMER message, если туда все равно передается сообщение WM_TIMER?

1. потому что таймер умеет дергать только глобальную (или статическую — один хрен функцию, соответствующую описанию
VOID CALLBACK TimerProc(
  HWND hwnd,         // handle to window
  UINT uMsg,         // WM_TIMER message
  UINT_PTR idEvent,  // timer identifier
  DWORD dwTime       // current system time
);

и он понятия не имеет о твоих классах/объектах.

2.by design
Konstantin Trunin
http://blog.trunin.com — эффективное управление людьми, проектами, собой
Re[7]: Есть Timer без окна?
От: akela  
Дата: 16.10.02 14:41
Оценка:
Здравствуйте Constructor, Вы писали:

C>Здравствуйте akela, Вы писали:


C>>>То есть, если в моем классе объявить обработчик ON_WM_TIMER(), то даже если нет окна, функция OnTimer будет вызываться в нужные моменты?


Э... Тут, кажется, от того, где находиться главный цикл обработки сообщений и маршрутизации комманд зависит.

C>У меня вот так:

C>
C>class COutControlCtrl : public COleControl
C>{
C>//...
C>private:
C>    TIMERPROC TimerProc1(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
C>}
C>

C> А как тогда правильно написать?

C>Объявить TimerProc1 вне класса или как static. Проблему доступа к нужному объекту класса COutControlCtrl из TimerProc1 придется как-то решать — например, если этот объект единственный, хранить ссылку на него в глобальной переменной.
Re[8]: Есть Timer без окна?
От: akela  
Дата: 16.10.02 14:51
Оценка:
Здравствуйте Joker3D, Вы писали:

JD>Здравствуйте Constructor, Вы писали:


C>>А теперь я попрошу поподробнее

C>>1. Почему она должна быть статической?
C>>2. Зачем у нее объявили 2-й параметр UINT uMsg, // WM_TIMER message, если туда все равно передается сообщение WM_TIMER?

JD>1. потому что таймер умеет дергать только глобальную (или статическую — один хрен функцию, соответствующую описанию

JD>
JD>VOID CALLBACK TimerProc(
JD>  HWND hwnd,         // handle to window
JD>  UINT uMsg,         // WM_TIMER message
JD>  UINT_PTR idEvent,  // timer identifier
JD>  DWORD dwTime       // current system time
JD>);
JD>

JD>и он понятия не имеет о твоих классах/объектах.

Позволю себе не согласиться. Это не пропускает компилятор, так как действительно, не совпадают типы. А таймеру пофиг, какая функция, ему интересен только ее адрес. Поэтому всякими нечестными способами типа union можно добиться вызова функции-члена класса, только надо очень осторожно следить за ее аргументами.
Re[8]: Есть Timer без окна?
От: akela  
Дата: 16.10.02 14:51
Оценка:
Здравствуйте Joker3D, Вы писали:

JD>Здравствуйте Constructor, Вы писали:


C>>А теперь я попрошу поподробнее

C>>1. Почему она должна быть статической?
C>>2. Зачем у нее объявили 2-й параметр UINT uMsg, // WM_TIMER message, если туда все равно передается сообщение WM_TIMER?

JD>1. потому что таймер умеет дергать только глобальную (или статическую — один хрен функцию, соответствующую описанию

JD>
JD>VOID CALLBACK TimerProc(
JD>  HWND hwnd,         // handle to window
JD>  UINT uMsg,         // WM_TIMER message
JD>  UINT_PTR idEvent,  // timer identifier
JD>  DWORD dwTime       // current system time
JD>);
JD>

JD>и он понятия не имеет о твоих классах/объектах.

Позволю себе не согласиться. Это не пропускает компилятор, так как действительно, не совпадают типы. А таймеру пофиг, какая функция, ему интересен только ее адрес. Поэтому всякими нечестными способами типа union можно добиться вызова функции-члена класса, только надо очень осторожно следить за ее аргументами.
Re[8]: Есть Timer без окна!
От: Constructor  
Дата: 16.10.02 14:57
Оценка:
Здравствуйте Joker3D, Вы писали:

JD>Здравствуйте Constructor, Вы писали:


C>>Здравствуйте Joker3D, Вы писали:


JD>>>не понимаю, зачем наследоваться от окна если его (окно) не создавать??? (возможно, тут ошибка в дизайне)


C>>Потому что в COleControl кроме функциональности окна еще очень много полезного, в частности, функциональность внутризадачного СОМ-сервера.


JD>>>2. статическую функцию : static TIMERPROC MyTimer(...) и в ней делать то что надо..


C>>А теперь я попрошу поподробнее

C>>1. Почему она должна быть статической?
C>>2. Зачем у нее объявили 2-й параметр UINT uMsg, // WM_TIMER message, если туда все равно передается сообщение WM_TIMER?

JD>1. потому что таймер умеет дергать только глобальную (или статическую — один хрен функцию, соответствующую описанию

JD>
JD>VOID CALLBACK TimerProc(
JD>  HWND hwnd,         // handle to window
JD>  UINT uMsg,         // WM_TIMER message
JD>  UINT_PTR idEvent,  // timer identifier
JD>  DWORD dwTime       // current system time
JD>);
JD>

JD>и он понятия не имеет о твоих классах/объектах.

JD>2.by design


У меня уже почти плучилось!
Тип функции должен быть не TIMERPROC, а VOID CALLBACK; а 3-й параметр пришлось объявить не UINT_PTR, а UINT, чтобы скомпилировалось. Объявил функцию статически, создаю таймер и приходят от него сообщения!
Я не могу из статической фунции вызвать нормальные методы класса — компилятор говорит, что так нельзя. Как тут быть?
Re[9]: Есть Timer без окна!
От: akela  
Дата: 16.10.02 15:05
Оценка:
Здравствуйте Constructor, Вы писали:

C>У меня уже почти плучилось!

C>Тип функции должен быть не TIMERPROC, а VOID CALLBACK; а 3-й параметр пришлось объявить не UINT_PTR, а UINT, чтобы скомпилировалось. Объявил функцию статически, создаю таймер и приходят от него сообщения!
C>Я не могу из статической фунции вызвать нормальные методы класса — компилятор говорит, что так нельзя. Как тут быть?

Там повыше уже был такой ответ:
Проблему доступа к нужному объекту класса COutControlCtrl из TimerProc1 придется как-то решать — например, если этот объект единственный, хранить ссылку на него в глобальной переменной.
Re[10]: Есть Timer без окна!
От: Constructor  
Дата: 16.10.02 15:13
Оценка:
Здравствуйте akela, Вы писали:

A>Здравствуйте Constructor, Вы писали:


C>>У меня уже почти плучилось!

C>>Тип функции должен быть не TIMERPROC, а VOID CALLBACK; а 3-й параметр пришлось объявить не UINT_PTR, а UINT, чтобы скомпилировалось. Объявил функцию статически, создаю таймер и приходят от него сообщения!
C>>Я не могу из статической фунции вызвать нормальные методы класса — компилятор говорит, что так нельзя. Как тут быть?

A>Там повыше уже был такой ответ:

A>Проблему доступа к нужному объекту класса COutControlCtrl из TimerProc1 придется как-то решать — например, если этот объект единственный, хранить ссылку на него в глобальной переменной.

Когда я начал писать новое сообщение, Вашего ответа ещё не было
Но вот с решением этого вопроса... Какая-то фигня... Решил одну проблему — получил другую.
Re[11]: Есть Timer без окна!
От: akela  
Дата: 16.10.02 15:27
Оценка:
Здравствуйте Constructor, Вы писали:

C>Здравствуйте akela, Вы писали:


A>>Здравствуйте Constructor, Вы писали:


C>Когда я начал писать новое сообщение, Вашего ответа ещё не было

C>Но вот с решением этого вопроса... Какая-то фигня... Решил одну проблему — получил другую.

А в чем проблема? Объектов больше одного? Нужен один таймер на всех или каждому свой? Можно придумать пару грязных хаков .
Re[11]: Есть Timer без окна!
От: igorl Россия  
Дата: 16.10.02 15:30
Оценка:
Здравствуйте Constructor, Вы писали:

C>Но вот с решением этого вопроса... Какая-то фигня... Решил одну проблему — получил другую.

Тут во время просмотра ветки возникла интересная (но, возможно бредовая ) мысль (сам не проверял).
Нужно каким-то образом передавать указатель на объект класса (н-р, this) в функцию. Для этого можно попробовать использовать параметр nIDEvent. Тут могут возникнуть две проблемы:
1. Если захочется создать несколько таймеров, работающих с одним классом (указатель одинаков, а должен быть разным, но — см. п. 2)
2. В MSDN сказано, что если hWnd == NULL, то параметр nIDEvent игнорируется. Поэтому возможно его и можно использовать и даже задавать одинаковым для любого таймера (однако возможно, что игнорирование также заключается и в том, что он не передается в обработчик — надо проверять). Если же нельзя, то тогда плохо, т.к. тогда придется действительно пользоваться глобальными переменными или еще что-то придумывать.
Re[12]: Есть Timer без окна!
От: akela  
Дата: 16.10.02 15:38
Оценка:
Здравствуйте igorl, Вы писали:

I>Здравствуйте Constructor, Вы писали:


C>>Но вот с решением этого вопроса... Какая-то фигня... Решил одну проблему — получил другую.

I>Тут во время просмотра ветки возникла интересная (но, возможно бредовая ) мысль (сам не проверял).
I>Нужно каким-то образом передавать указатель на объект класса (н-р, this) в функцию. Для этого можно попробовать использовать параметр nIDEvent.

Это работает (проверено). Но это, по-моему, относится к разряду опасных решений.
Re[13]: Есть Timer без окна!
От: igorl Россия  
Дата: 16.10.02 16:30
Оценка:
Здравствуйте akela, Вы писали:

A>Это работает (проверено). Но это, по-моему, относится к разряду опасных решений.

Согласен. Надежным это не выглядит .
Re: Есть Timer без окна?
От: AlexRb  
Дата: 17.10.02 03:51
Оценка:
Здравствуйте Constructor, Вы писали:

C>Здравствуйте!

C>Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну.
C>А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?

Может Вам поможет Multimedia Timers в MSDN. Т.е.:
CreateWaitableTimer()
SetWaitableTimer()
WaitForSingleObject()
Re[8]: Есть Timer без окна?
От: Pushkin Россия www.linkbit.com
Дата: 17.10.02 05:19
Оценка:
Здравствуйте akela, Вы писали:

C>>Объявить TimerProc1 вне класса или как static. Проблему доступа к нужному объекту класса COutControlCtrl из TimerProc1 придется как-то решать — например, если этот объект единственный, хранить ссылку на него в глобальной переменной.


А если не единственный? Поему бы не написать:

TIMERPROC TimerProc1(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    CMyObject* obj=(CMyObject*)idEvent;
    ........
} 

SetTimer(0, (UINT)this, 100, TimerProc1);
Re[12]: Есть Timer без окна!
От: Constructor  
Дата: 17.10.02 13:06
Оценка:
Здравствуйте akela, Вы писали:

A>Здравствуйте Constructor, Вы писали:


C>>Здравствуйте akela, Вы писали:


A>>>Здравствуйте Constructor, Вы писали:


C>>Когда я начал писать новое сообщение, Вашего ответа ещё не было

C>>Но вот с решением этого вопроса... Какая-то фигня... Решил одну проблему — получил другую.

A>А в чем проблема? Объектов больше одного? Нужен один таймер на всех или каждому свой? Можно придумать пару грязных хаков .


Да, объектов больше одного. Каждому объекту нужен свой таймер. А если, например, создать глобальную перемнную-список, в него добавлять адрес создаваемого объекта, а в TimerProc проверять, совпадает ли idEvent с каким-нибудб адресом объекта. Если совпадает, то вызывать для этого объекта обработчик?
Re[13]: Есть Timer без окна!
От: akela  
Дата: 17.10.02 14:00
Оценка:
Здравствуйте Constructor, Вы писали:

C>Да, объектов больше одного. Каждому объекту нужен свой таймер. А если, например, создать глобальную перемнную-список, в него добавлять адрес создаваемого объекта, а в TimerProc проверять, совпадает ли idEvent с каким-нибудб адресом объекта. Если совпадает, то вызывать для этого объекта обработчик?


Там где-то среди ответов (и не один раз ) появлялось предложение передавать в качестве idEvent адрес объекта, а в TimerProc приводить его к нужному типу и вызывать метод класса.
Это будет работать, хотя лично у меня такая конструкция вызывает некоторое внутреннее противодействие. Мне больше нравиться конструкция вроде статического массива указателей на объекты класса, в который объект прописывается при создании, и использования в качестве idEvent индекса элемента в массиве. Разумных аргументов за то, чтобы делать именно так, привести не могу . В общем, выбирай что хочешь .
Re[14]: Есть Timer без окна!
От: Constructor  
Дата: 17.10.02 14:14
Оценка:
Здравствуйте akela, Вы писали:

A>Здравствуйте Constructor, Вы писали:


C>>Да, объектов больше одного. Каждому объекту нужен свой таймер. А если, например, создать глобальную перемнную-список, в него добавлять адрес создаваемого объекта, а в TimerProc проверять, совпадает ли idEvent с каким-нибудб адресом объекта. Если совпадает, то вызывать для этого объекта обработчик?


A>Там где-то среди ответов (и не один раз ) появлялось предложение передавать в качестве idEvent адрес объекта, а в TimerProc приводить его к нужному типу и вызывать метод класса.


Я так сделал. Но такой способ дает сбои. Я не понял почему, в какие моменты (не выяснял), но периодически получал ссобщение, что то ли пишется память, то ли читается память коряво, короче, прога закрывалась.

A>Это будет работать, хотя лично у меня такая конструкция вызывает некоторое внутреннее противодействие. Мне больше нравиться конструкция вроде статического массива указателей на объекты класса, в который объект прописывается при создании, и использования в качестве idEvent индекса элемента в массиве. Разумных аргументов за то, чтобы делать именно так, привести не могу . В общем, выбирай что хочешь .


Я хочу попробовать способ "вроде статического массива указателей". Только мне массив не подходит — число элементов заранее неизвестно. Вот и хочу список попробовать.
Re[15]: Есть Timer без окна!
От: akela  
Дата: 17.10.02 14:24
Оценка:
Здравствуйте Constructor, Вы писали:

Только мне массив не подходит — число элементов заранее неизвестно. Вот и хочу список попробовать.

Упс. Я пользуюсь внутренней библиотекой, у нас все массивы динамические . Вот и забываю, что бывают другие массивы .
Re: Есть Timer без окна?
От: dandy  
Дата: 18.10.02 02:42
Оценка:
Здравствуйте Constructor, Вы писали:

C>Здравствуйте!

C>Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну.
C>А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?

A> Можно попробовать воспользоваться WaitableTimer, кое — какие примеры есть у Рихтера:


HANDLE CreateWaitableTimer(
PSECURITY_ATTRIBUTES psa,
BOOL fManualReset,
PCTSTR pszName);

Если пишешь будильник, скорее всего проще будет как-то получить хендл.
A>
Re[12]: Нет Timer без окна!
От: Constructor  
Дата: 18.10.02 11:50
Оценка:
Здравствуйте igorl, Вы писали:

I>Здравствуйте Constructor, Вы писали:


C>>Но вот с решением этого вопроса... Какая-то фигня... Решил одну проблему — получил другую.

I>Тут во время просмотра ветки возникла интересная (но, возможно бредовая ) мысль (сам не проверял).
I>Нужно каким-то образом передавать указатель на объект класса (н-р, this) в функцию. Для этого можно попробовать использовать параметр nIDEvent. Тут могут возникнуть две проблемы:
I>1. Если захочется создать несколько таймеров, работающих с одним классом (указатель одинаков, а должен быть разным, но — см. п. 2)
I>2. В MSDN сказано, что если hWnd == NULL, то параметр nIDEvent игнорируется. Поэтому возможно его и можно использовать и даже задавать одинаковым для любого таймера (однако возможно, что игнорирование также заключается и в том, что он не передается в обработчик — надо проверять). Если же нельзя, то тогда плохо, т.к. тогда придется действительно пользоваться глобальными переменными или еще что-то придумывать.

Что-то не выходит каменный цветок

Завел статический список указателей, в который добавляются адреса содаваемых объектов класса.
В функции TimerProc сравниваю idEvent с PtrToUlong(адрес объекта) в цикле по всем объектам. Если бы idEvent совпал с адресом, то для этого объекта я бы вызвал функцию — обработчик. Так вот никода они не совпадают! Я смотрел значения idEvent и адресов. Вот, например, адреса двух объектов: 17211120 и 17300632, в то время как в idEvent бывают 32474 и 32475! Видимо, ::SetTimer урезает числа до short... Но почему???
Re[13]: Нет Timer без окна!
От: akela  
Дата: 18.10.02 14:32
Оценка:
Здравствуйте Constructor, Вы писали:

C>Завел статический список указателей, в который добавляются адреса содаваемых объектов класса.

C>В функции TimerProc сравниваю idEvent с PtrToUlong(адрес объекта) в цикле по всем объектам. Если бы idEvent совпал с адресом, то для этого объекта я бы вызвал функцию — обработчик. Так вот никода они не совпадают!

C>Я смотрел значения idEvent и адресов. Вот, например, адреса двух объектов: 17211120 и 17300632, в то время как в idEvent бывают 32474 и 32475! Видимо, ::SetTimer урезает числа до short... Но почему???


Странно, у меня все работало...
Почему ты не хочешь в качестве idEvent использовать индекс объекта в списке, а не его адресс? Это более логично. Надо только заботиться о том, чтобы он не менялся на протяжении жизни объекта.
Re[14]: Все-таки есть Timer без окна!
От: Constructor  
Дата: 21.10.02 06:08
Оценка:
Здравствуйте akela, Вы писали:

A>Здравствуйте Constructor, Вы писали:


C>>Завел статический список указателей, в который добавляются адреса содаваемых объектов класса.

C>>В функции TimerProc сравниваю idEvent с PtrToUlong(адрес объекта) в цикле по всем объектам. Если бы idEvent совпал с адресом, то для этого объекта я бы вызвал функцию — обработчик. Так вот никода они не совпадают!

C>>Я смотрел значения idEvent и адресов. Вот, например, адреса двух объектов: 17211120 и 17300632, в то время как в idEvent бывают 32474 и 32475! Видимо, ::SetTimer урезает числа до short... Но почему???


A>Странно, у меня все работало...

A>Почему ты не хочешь в качестве idEvent использовать индекс объекта в списке, а не его адресс? Это более логично. Надо только заботиться о том, чтобы он не менялся на протяжении жизни объекта.

Я разобрался!
Дело в том, что в SetTimer вторым переметром передаешь жедаемый номер таймера, но реальный номер таймера возвращает сама функция! Его-то надо запомнить. А я в TimerProc сравнивал idEvent с теми номерами, что передавал в SetTimer! Вот в чем была фишка! Теперь все работает!
Выходит, передавать в качестве idEvent можно и индекс в списке, и адрес, и всякую лабуду!

Всем спасибо за помощь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.