Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Простая консольная аппликацыя
Zem
#1 Оставлено : 18 декабря 2008 г. 2:59:53(UTC)
Ранг: Активный Участник

Группы: Зарегистрированные пользователи
Зарегистрирован: 23.08.2008(UTC)
Сообщений: 52
Баллов: 156
Мужчина

Сказал «Спасибо»: 4 раз
Код:
#include <windows.h>
#include <stdio.h>

int CALLBACK tick(){printf("tick\n");return 0;}

int main(int argc, char *argv[])
{        
    SetTimer(NULL, 0, 1000, (TIMERPROC)tick);
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
<font face="Arial"><font size="2"><b>Никак не могу разобратся в последовательности происходящего в этой програмке. Каким образом зацикливается tick(), если SetTimer() не входит ни в один цыкл???</b></font id="size2"></font id="Arial">
Реклама
Alexander.Kudakov
#2 Оставлено : 18 декабря 2008 г. 13:57:01(UTC)
Ранг: Администратор

Группы: Администраторы, Модераторы, Зарегистрированные пользователи
Зарегистрирован: 15.12.2002(UTC)
Сообщений: 2,418
Баллов: 7,303
Откуда: Russia Санкт-Петербург

Поблагодарили: 4 раз в 4 постах
да что вы говорите?! а WM_TIMER сообщение не приходит??
Zem
#3 Оставлено : 18 декабря 2008 г. 21:15:09(UTC)
Ранг: Активный Участник

Группы: Зарегистрированные пользователи
Зарегистрирован: 23.08.2008(UTC)
Сообщений: 52
Баллов: 156
Мужчина

Сказал «Спасибо»: 4 раз
<blockquote id="quote"><font size="1" face="Verdana, Helvetica, Arial" id="quote">quote:<hr height="1" noshade id="quote"><i>Originally posted by Alexander.Kudakov</i>
<br />да что вы говорите?! а WM_TIMER сообщение не приходит??
<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote"><font face="Arial"><font size="4"><b>А куда? Что является его обработчиком? Это ж не оконная аппликацыя, а tick() не оконная процедура и как обработчик она ни в каких таблицах сообщений не определена.

Ну, предположим что так как tick() указана в SetTimer то именно она является обработчиком.

Таким образом получается следующая картина:

Выполнение функции начинается с main(). Запускается SetTimer() через секунду tick().
Дальше выделяется память под msg (MSG msg;) и начинает выполнятся цыкл обработки сообщений.
В последствии так как оконной процедуры с, даже, минимальным свичём нет, а единственным обработчиком получается tick(), то все сообщения дружно идут к нему но только на WM_TIMER он реагирует. А SetTimer(), видимо, запускает отдельный поток или процесс чтоб он каждую секунду посылал WM_TIMER.

Ещё версии есть???</b></font id="size4"></font id="Arial">

Alexander.Kudakov
#4 Оставлено : 18 декабря 2008 г. 22:33:44(UTC)
Ранг: Администратор

Группы: Администраторы, Модераторы, Зарегистрированные пользователи
Зарегистрирован: 15.12.2002(UTC)
Сообщений: 2,418
Баллов: 7,303
Откуда: Russia Санкт-Петербург

Поблагодарили: 4 раз в 4 постах
не нужно писать такими крупными буковками...
потрудитесь справку почитать msdn.microsoft.com/en-us/library/ms644901(VS.85).aspx
там и пример есть..
Zem
#5 Оставлено : 19 декабря 2008 г. 4:21:37(UTC)
Ранг: Активный Участник

Группы: Зарегистрированные пользователи
Зарегистрирован: 23.08.2008(UTC)
Сообщений: 52
Баллов: 156
Мужчина

Сказал «Спасибо»: 4 раз
<font face="Arial"><font size="3"><b>Прочитал от корки до корки (про таймер), но полное понимание происходящего в моём простеньком примере не наступило...</b></font id="size3"></font id="Arial">
<blockquote id="quote"><font size="1" face="Verdana, Helvetica, Arial" id="quote">quote:<hr height="1" noshade id="quote">Remarks

You can process the message by providing a WM_TIMER case in the window procedure. <u>Otherwise</u>, DispatchMessage will call <font color="red">the TimerProc callback function</font id="red"> specified in the call to the SetTimer function used to install the timer.
<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote"> <font face="Arial"><font size="3"><b>Тоесть the TimerProc callback function и есть <font color="red">tick</font id="red">(). Я правильно понял? И весь этот цыкл обработки сообщений нужен только чтоб включённый где-то таймер мог запустить функцыю tick()? Но как tick() может принять от DispatchMessage() сообщение если она определена мной и не является оконной процедурой, которая обычно имеет переменные (HWND, UINT, WPARAM, LPARAM) в которые и принимает сообщение.</b></font id="size3"></font id="Arial">
<blockquote id="quote"><font size="1" face="Verdana, Helvetica, Arial" id="quote">quote:<hr height="1" noshade id="quote"> не нужно писать такими крупными буковками...
<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote"> <font face="Arial"><font size="3"><b>Извините, я хотел чтоб было удобней читать и видимо не учёл что это именно мой монитор настолько приуменьшает ваш шрифт что его невозможно читать без слёз. Прийдётся поменять своё разрешение :(

А таймеры мне нужны чтоб каждые N секунд отправлять пинг на сервер, а с потоками очень не хочется связыватся. Но вот возникла проблемма - recv() когда данные от сервера не идут задерживает выполнение программы более чем на 30 секунд и пинг уже поздно посылать...:(</b></font id="size3"></font id="Arial">
Alexander.Kudakov
#6 Оставлено : 19 декабря 2008 г. 14:57:15(UTC)
Ранг: Администратор

Группы: Администраторы, Модераторы, Зарегистрированные пользователи
Зарегистрирован: 15.12.2002(UTC)
Сообщений: 2,418
Баллов: 7,303
Откуда: Russia Санкт-Петербург

Поблагодарили: 4 раз в 4 постах
Zem
#7 Оставлено : 19 декабря 2008 г. 16:25:43(UTC)
Ранг: Активный Участник

Группы: Зарегистрированные пользователи
Зарегистрирован: 23.08.2008(UTC)
Сообщений: 52
Баллов: 156
Мужчина

Сказал «Спасибо»: 4 раз
<font face="Arial"><font size="3"><b>Очень благодарен за полезные ссылки и труд приложеный для их отыскания, спасибо.</b></font id="size3"></font id="Arial">
Dimitry.Ketov
#8 Оставлено : 19 декабря 2008 г. 16:45:34(UTC)
Ранг: Активный Участник

Группы: Зарегистрированные пользователи
Зарегистрирован: 01.12.2002(UTC)
Сообщений: 3,382
Баллов: 10,146
Откуда: Russia Санкт-Петербург

У вас плохое зрение, извините на <font size="6">нескромный</font id="size6"> вопрос?
Zem
#9 Оставлено : 20 декабря 2008 г. 1:50:07(UTC)
Ранг: Активный Участник

Группы: Зарегистрированные пользователи
Зарегистрирован: 23.08.2008(UTC)
Сообщений: 52
Баллов: 156
Мужчина

Сказал «Спасибо»: 4 раз
<font face="Arial"><font size="2"><b><i>Dimitry.Ketov</i>, Ещё не плохое но чем больше работаю с компьютером тем хуже. Наверное Вы намекаете чтоб я не использовал шрифты но зачем же разработчики форума включили такую возможность?</b></font id="size2"></font id="Arial">
Dimitry.Ketov
#10 Оставлено : 22 декабря 2008 г. 14:08:40(UTC)
Ранг: Активный Участник

Группы: Зарегистрированные пользователи
Зарегистрирован: 01.12.2002(UTC)
Сообщений: 3,382
Баллов: 10,146
Откуда: Russia Санкт-Петербург

<blockquote id="quote"><font size="1" face="Verdana, Helvetica, Arial" id="quote">quote:<hr height="1" noshade id="quote"><i>Originally posted by Zem</i>
<br /><font face="Arial"><font size="2"><b><i>Dimitry.Ketov</i>, Ещё не плохое но чем больше работаю с компьютером тем хуже. Наверное Вы намекаете чтоб я не использовал шрифты но зачем же разработчики форума включили такую возможность?</b></font id="size2"></font id="Arial">
<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">

Ну да, топором старушек убивать нельзя, зачем же разработчики топора включили такую возможность?
Zem
#11 Оставлено : 5 января 2009 г. 2:22:40(UTC)
Ранг: Активный Участник

Группы: Зарегистрированные пользователи
Зарегистрирован: 23.08.2008(UTC)
Сообщений: 52
Баллов: 156
Мужчина

Сказал «Спасибо»: 4 раз
Однако! Убедили, больше к шрифтам не притронусь, обещаю.
aleavd
#12 Оставлено : 28 июля 2010 г. 21:43:12(UTC)
Ранг: Новичок

Группы: Зарегистрированные пользователи
Зарегистрирован: 28.07.2010(UTC)
Сообщений: 1
Баллов: 3

Программа "зацикливается" потому что таймер срабатывает каждую секунду. Нужно удалить таймер если хотите чтобы он сработал только один раз.

int main(int argc, char *argv[])
{
UINT_PTR up = SetTimer(NULL, 0, 1000, (TIMERPROC)tick);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if ( msg.message == WM_TIMER )
{
KillTimer(NULL, up); // удаляем таймер
break; // выходим из цикла обработки сообщений
}
}

return 0;
}
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (4)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.