Здравствуйте!
Функция 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>Но вот с решением этого вопроса... Какая-то фигня... Решил одну проблему — получил другую.
А в чем проблема? Объектов больше одного? Нужен один таймер на всех или каждому свой? Можно придумать пару грязных хаков .