Здравствуйте!
Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну.
А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?
Здравствуйте Constructor, Вы писали:
C>Здравствуйте! C>Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну. C>А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?
Пиши 0 вместо указателя на окно
Здравствуйте Constructor, Вы писали:
C>Здравствуйте! C>Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну. C>А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?
создай окно. (см. VCL'евский TTimer)
Konstantin Trunin http://blog.trunin.com — эффективное управление людьми, проектами, собой
Здравствуйте 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?
Здравствуйте 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); Так не хочет компилироваться.(
Здравствуйте 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
Здравствуйте Constructor, Вы писали:
C>То есть, если в моем классе объявить обработчик ON_WM_TIMER(), то даже если нет окна, функция OnTimer будет вызываться в нужные моменты?
А что за класс, от чего унаследован?
C>TimerProc1 объявлена в классе.
В классе ее объявлять нельзя. Разве что только как статическую функцию. А как ты ее объявляешь?
Здравствуйте 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 — эффективное управление людьми, проектами, собой
Здравствуйте 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);
}
Здравствуйте 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 создавал, а окно для этого класса не создавал, поэтому-то и возник данный вопрос.
Здравствуйте 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 — эффективное управление людьми, проектами, собой
Здравствуйте Joker3D, Вы писали:
JD>не понимаю, зачем наследоваться от окна если его (окно) не создавать??? (возможно, тут ошибка в дизайне)
Потому что в COleControl кроме функциональности окна еще очень много полезного, в частности, функциональность внутризадачного СОМ-сервера.
JD>2. статическую функцию : static TIMERPROC MyTimer(...) и в ней делать то что надо..
А теперь я попрошу поподробнее
1. Почему она должна быть статической?
2. Зачем у нее объявили 2-й параметр UINT uMsg, // WM_TIMER message, если туда все равно передается сообщение WM_TIMER?
Здравствуйте 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 — эффективное управление людьми, проектами, собой
Здравствуйте Constructor, Вы писали:
C>Здравствуйте akela, Вы писали:
C>>>То есть, если в моем классе объявить обработчик ON_WM_TIMER(), то даже если нет окна, функция OnTimer будет вызываться в нужные моменты?
Э... Тут, кажется, от того, где находиться главный цикл обработки сообщений и маршрутизации комманд зависит.
C>У меня вот так: C>
C> А как тогда правильно написать?
C>Объявить TimerProc1 вне класса или как static. Проблему доступа к нужному объекту класса COutControlCtrl из TimerProc1 придется как-то решать — например, если этот объект единственный, хранить ссылку на него в глобальной переменной.
Здравствуйте 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 можно добиться вызова функции-члена класса, только надо очень осторожно следить за ее аргументами.
Здравствуйте 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 можно добиться вызова функции-члена класса, только надо очень осторожно следить за ее аргументами.
Здравствуйте 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, чтобы скомпилировалось. Объявил функцию статически, создаю таймер и приходят от него сообщения!
Я не могу из статической фунции вызвать нормальные методы класса — компилятор говорит, что так нельзя. Как тут быть?
Здравствуйте Constructor, Вы писали:
C>У меня уже почти плучилось! C>Тип функции должен быть не TIMERPROC, а VOID CALLBACK; а 3-й параметр пришлось объявить не UINT_PTR, а UINT, чтобы скомпилировалось. Объявил функцию статически, создаю таймер и приходят от него сообщения! C>Я не могу из статической фунции вызвать нормальные методы класса — компилятор говорит, что так нельзя. Как тут быть?
Там повыше уже был такой ответ:
Проблему доступа к нужному объекту класса COutControlCtrl из TimerProc1 придется как-то решать — например, если этот объект единственный, хранить ссылку на него в глобальной переменной.
Здравствуйте akela, Вы писали:
A>Здравствуйте Constructor, Вы писали:
C>>У меня уже почти плучилось! C>>Тип функции должен быть не TIMERPROC, а VOID CALLBACK; а 3-й параметр пришлось объявить не UINT_PTR, а UINT, чтобы скомпилировалось. Объявил функцию статически, создаю таймер и приходят от него сообщения! C>>Я не могу из статической фунции вызвать нормальные методы класса — компилятор говорит, что так нельзя. Как тут быть?
A>Там повыше уже был такой ответ: A>Проблему доступа к нужному объекту класса COutControlCtrl из TimerProc1 придется как-то решать — например, если этот объект единственный, хранить ссылку на него в глобальной переменной.
Когда я начал писать новое сообщение, Вашего ответа ещё не было
Но вот с решением этого вопроса... Какая-то фигня... Решил одну проблему — получил другую.
Здравствуйте Constructor, Вы писали:
C>Здравствуйте akela, Вы писали:
A>>Здравствуйте Constructor, Вы писали:
C>Когда я начал писать новое сообщение, Вашего ответа ещё не было C>Но вот с решением этого вопроса... Какая-то фигня... Решил одну проблему — получил другую.
А в чем проблема? Объектов больше одного? Нужен один таймер на всех или каждому свой? Можно придумать пару грязных хаков .
Здравствуйте Constructor, Вы писали:
C>Но вот с решением этого вопроса... Какая-то фигня... Решил одну проблему — получил другую.
Тут во время просмотра ветки возникла интересная (но, возможно бредовая ) мысль (сам не проверял).
Нужно каким-то образом передавать указатель на объект класса (н-р, this) в функцию. Для этого можно попробовать использовать параметр nIDEvent. Тут могут возникнуть две проблемы:
1. Если захочется создать несколько таймеров, работающих с одним классом (указатель одинаков, а должен быть разным, но — см. п. 2)
2. В MSDN сказано, что если hWnd == NULL, то параметр nIDEvent игнорируется. Поэтому возможно его и можно использовать и даже задавать одинаковым для любого таймера (однако возможно, что игнорирование также заключается и в том, что он не передается в обработчик — надо проверять). Если же нельзя, то тогда плохо, т.к. тогда придется действительно пользоваться глобальными переменными или еще что-то придумывать.
Здравствуйте igorl, Вы писали:
I>Здравствуйте Constructor, Вы писали:
C>>Но вот с решением этого вопроса... Какая-то фигня... Решил одну проблему — получил другую. I>Тут во время просмотра ветки возникла интересная (но, возможно бредовая ) мысль (сам не проверял). I>Нужно каким-то образом передавать указатель на объект класса (н-р, this) в функцию. Для этого можно попробовать использовать параметр nIDEvent.
Это работает (проверено). Но это, по-моему, относится к разряду опасных решений.
Здравствуйте Constructor, Вы писали:
C>Здравствуйте! C>Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну. C>А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?
Здравствуйте akela, Вы писали:
C>>Объявить TimerProc1 вне класса или как static. Проблему доступа к нужному объекту класса COutControlCtrl из TimerProc1 придется как-то решать — например, если этот объект единственный, хранить ссылку на него в глобальной переменной.
Здравствуйте akela, Вы писали:
A>Здравствуйте Constructor, Вы писали:
C>>Здравствуйте akela, Вы писали:
A>>>Здравствуйте Constructor, Вы писали:
C>>Когда я начал писать новое сообщение, Вашего ответа ещё не было C>>Но вот с решением этого вопроса... Какая-то фигня... Решил одну проблему — получил другую.
A>А в чем проблема? Объектов больше одного? Нужен один таймер на всех или каждому свой? Можно придумать пару грязных хаков .
Да, объектов больше одного. Каждому объекту нужен свой таймер. А если, например, создать глобальную перемнную-список, в него добавлять адрес создаваемого объекта, а в TimerProc проверять, совпадает ли idEvent с каким-нибудб адресом объекта. Если совпадает, то вызывать для этого объекта обработчик?
Здравствуйте Constructor, Вы писали:
C>Да, объектов больше одного. Каждому объекту нужен свой таймер. А если, например, создать глобальную перемнную-список, в него добавлять адрес создаваемого объекта, а в TimerProc проверять, совпадает ли idEvent с каким-нибудб адресом объекта. Если совпадает, то вызывать для этого объекта обработчик?
Там где-то среди ответов (и не один раз ) появлялось предложение передавать в качестве idEvent адрес объекта, а в TimerProc приводить его к нужному типу и вызывать метод класса.
Это будет работать, хотя лично у меня такая конструкция вызывает некоторое внутреннее противодействие. Мне больше нравиться конструкция вроде статического массива указателей на объекты класса, в который объект прописывается при создании, и использования в качестве idEvent индекса элемента в массиве. Разумных аргументов за то, чтобы делать именно так, привести не могу . В общем, выбирай что хочешь .
Здравствуйте akela, Вы писали:
A>Здравствуйте Constructor, Вы писали:
C>>Да, объектов больше одного. Каждому объекту нужен свой таймер. А если, например, создать глобальную перемнную-список, в него добавлять адрес создаваемого объекта, а в TimerProc проверять, совпадает ли idEvent с каким-нибудб адресом объекта. Если совпадает, то вызывать для этого объекта обработчик?
A>Там где-то среди ответов (и не один раз ) появлялось предложение передавать в качестве idEvent адрес объекта, а в TimerProc приводить его к нужному типу и вызывать метод класса.
Я так сделал. Но такой способ дает сбои. Я не понял почему, в какие моменты (не выяснял), но периодически получал ссобщение, что то ли пишется память, то ли читается память коряво, короче, прога закрывалась.
A>Это будет работать, хотя лично у меня такая конструкция вызывает некоторое внутреннее противодействие. Мне больше нравиться конструкция вроде статического массива указателей на объекты класса, в который объект прописывается при создании, и использования в качестве idEvent индекса элемента в массиве. Разумных аргументов за то, чтобы делать именно так, привести не могу . В общем, выбирай что хочешь .
Я хочу попробовать способ "вроде статического массива указателей". Только мне массив не подходит — число элементов заранее неизвестно. Вот и хочу список попробовать.
Здравствуйте Constructor, Вы писали:
C>Здравствуйте! C>Функция SetTimer требует указать хэндл окна, сообщения OnTimer шлются тоже окну. C>А как быть, если у класса окна нет, а хожется получать собщения через заданные промежутки времени?
A> Можно попробовать воспользоваться WaitableTimer, кое — какие примеры есть у Рихтера:
Здравствуйте 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... Но почему???
Здравствуйте Constructor, Вы писали:
C>Завел статический список указателей, в который добавляются адреса содаваемых объектов класса. C>В функции TimerProc сравниваю idEvent с PtrToUlong(адрес объекта) в цикле по всем объектам. Если бы idEvent совпал с адресом, то для этого объекта я бы вызвал функцию — обработчик. Так вот никода они не совпадают!
C>Я смотрел значения idEvent и адресов. Вот, например, адреса двух объектов: 17211120 и 17300632, в то время как в idEvent бывают 32474 и 32475! Видимо, ::SetTimer урезает числа до short... Но почему???
Странно, у меня все работало...
Почему ты не хочешь в качестве idEvent использовать индекс объекта в списке, а не его адресс? Это более логично. Надо только заботиться о том, чтобы он не менялся на протяжении жизни объекта.
Здравствуйте 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 можно и индекс в списке, и адрес, и всякую лабуду!