Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Тело процедуры не выполняется


Автор: CYBERDREAM 3.10.2007, 14:57
Приветствую всех.
Может и глупо, но все же. В С++ почти ноль, хотя надобно его знать.
Вообщем имеется консольное приложение, в определенный момент запаскаю таймер, который должен вызвать мою процедуру, но увы тело не последней не выполняется.

Код

//собственно сама процедура.
VOID CALLBACK TP1(HWND hwnd,UINT uMsg, UINT idEvent, DWORD dwTime)

{
            //Собственно и сама загвоздка
    puts("Hi man, it's only start");
}
....
....
//и где то запускаем наш таймер
SetTimer(NULL,10,100,(TIMERPROC)TP1);

Может проблема в том, что я передаю в качестве идентификатора окна NULL?

Автор: Lazin 3.10.2007, 15:08
если приложение консольное, то возможно, что, программа завершается раньше чем срабатывает таймер. Создай Event и жди его перед завершением программы, а в обработчике таймера устанавливай его.


Код

HANDLE event;
//собственно сама процедура.
VOID CALLBACK TP1(HWND hwnd,UINT uMsg, UINT idEvent, DWORD dwTime)
{
            //Собственно и сама загвоздка
    puts("Hi man, it's only start");
    SetEvent(event);
}
....
int main()
{
....
event = CreateEvent(NULL,FALSE,FALSE,NULL);
****
SetTimer(NULL,10,100,(TIMERPROC)TP1);
****
WaitForSingleObject(event, INFINITE);
CloseHandle(event);
}


Добавлено через 49 секунд
HWND нужен для того чтобы таймер посылал сообщения окну

Автор: CYBERDREAM 3.10.2007, 15:18
Приложение пашет, пока я не нажму кобминацию клавиш, либо не закроую лично.  smile  
Так что думаю предложенный метод ясности не внесет в этот вопрос

Автор: xvr 3.10.2007, 15:36
Цитата(CYBERDREAM @ 3.10.2007,  14:57)
Приветствую всех.
Может и глупо, но все же. В С++ почти ноль, хотя надобно его знать.
Вообщем имеется консольное приложение, в определенный момент запаскаю таймер, который должен вызвать мою процедуру, но увы тело не последней не выполняется.

Код

//собственно сама процедура.
VOID CALLBACK TP1(HWND hwnd,UINT uMsg, UINT idEvent, DWORD dwTime)

{
            //Собственно и сама загвоздка
    puts("Hi man, it's only start");
}
....
....
//и где то запускаем наш таймер
SetTimer(NULL,10,100,(TIMERPROC)TP1);

Может проблема в том, что я передаю в качестве идентификатора окна NULL?

С++ тут не при чем smile
Что бы срабатывали таймерные callback'и программа должна выполнять цикл обработки оконных сообщений (GetMessage/DispatchMessage), вне зависимости от того, консольная программа или нет и используется HWND в параметрах таймера или нет.

Автор: CYBERDREAM 3.10.2007, 15:38
Так что же мне нужно исправить в коде? smile 

Автор: dumb 3.10.2007, 15:51
Цитата(CYBERDREAM @  3.10.2007,  16:38 Найти цитируемый пост)
Так что же мне нужно исправить в коде?
для начала его надо показать, либо подробно рассказать, что и как делается в нем.
а так - просто добавить цикл выборки сообщений:
Код

MSG msg;
BOOL bRet;
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
}

Автор: CYBERDREAM 4.10.2007, 09:08
Thx to dumb. It works  smile 
всем спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)