?

Log in

No account? Create an account
Таймер - C/C++ Developers — LiveJournal [entries|archive|friends|userinfo]
C/C++ Developers

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Таймер [May. 22nd, 2007|04:55 pm]
C/C++ Developers
ru_c
[smilingcrank]
Доброе время суток!
Подскажите пожалуйста, как написать на Си таймер. Нужно, чтобы каждую секунду вызывалась некотороая функция. Возможны вставки на ассемблере. Среда разработки - Borland C++ 3.1, использование классов, компонент и прочих прелестей C++ Builder запрещены.
linkReply

Comments:
From: (Anonymous)
2007-05-22 02:59 pm (UTC)

void sleeping( int second )
{
clock_t goal;

goal = ( second * CLOCKS_PER_SEC ) + clock();

while(goal > clock())
{

//тут твои функции

}
(Reply) (Thread)
From: analizer
2007-05-22 04:22 pm (UTC)
SetTimer, однозначно. WINAPI тоже временами штука полезная.
В MSDN вопщем.
(Reply) (Parent) (Thread)
From: smilingcrank
2007-05-22 04:38 pm (UTC)
Среда разработки - Borland C++ 3.1, 1990-ого года выпуска. Сомневаюсь, что здесь есть WinApi х)
(Reply) (Parent) (Thread)
From: analizer
2007-05-22 04:49 pm (UTC)
ВинАпи есть есть везде где есть винда.
Всего лишь нужен хидер
[Error: Irreparable invalid markup ('<windows.h>') in entry. Owner must fix manually. Raw contents below.]

ВинАпи есть есть везде где есть винда.
Всего лишь нужен хидер <windows.h> найти его отдельно думаю не будет проблемой.
(Reply) (Parent) (Thread)
From: smilingcrank
2007-05-22 05:23 pm (UTC)
Приложение ДОСовское, 16-битное. Библиотека windows отсутствует.
(Reply) (Parent) (Thread)
[User Picture]From: sky_thunder
2007-05-22 06:15 pm (UTC)
Ну, не только хэдер нужен. Еще библиотеки импорта и start-up библиотека. Конечно, все это в некастрированом BC 3.1 должно быть.
(Reply) (Parent) (Thread)
From: (Anonymous)
2007-05-22 04:22 pm (UTC)
SetTimer, однозначно. WINAPI тоже временами штука полезная.
В MSDN вопщем.
(Reply) (Parent) (Thread)
[User Picture]From: sky_thunder
2007-05-22 03:45 pm (UTC)
#include
[Error: Irreparable invalid markup ('<dos.h>') in entry. Owner must fix manually. Raw contents below.]

#include <dos.h>

foo()
{
for(;;)
{
some_function();
delay(1000);
}
}
(Reply) (Thread)
From: smilingcrank
2007-05-22 04:03 pm (UTC)
Видимо, я не совсем верно выразился. Мне надо, чтобы функция вызывалась независимо от основной части программы, то есть между вызовами some_function() программа должна выполнять какие-то другие функции. Чтобы было более понятно, я пишу игру "Крестики-нолики". То есть основную часть времени пользователь должен видеть поле для игры и двигать мышью (и всё это без каких-либо задержек). И каждую секунду в углу экрана должны меняться цифры, показывая время.
(Reply) (Parent) (Thread)
[User Picture]From: sky_thunder
2007-05-22 04:22 pm (UTC)
На прерывание 1Ch надо повеситься, если я правильно помню. Можно на 9, но не желательно. См. help по setvect, getvect. Это один способ. Другой - просто проверять время в основном цикле программы.
(Reply) (Parent) (Thread)
From: smilingcrank
2007-05-22 04:35 pm (UTC)
Вы говорите про функцию time()? Сейчас вот пытаюсь с её помощью поставить таймер.
(Reply) (Parent) (Thread)
[User Picture]From: sky_thunder
2007-05-22 04:53 pm (UTC)
Я не говорю про функцию time.
(Reply) (Parent) (Thread)
From: smilingcrank
2007-05-22 05:22 pm (UTC)
>>Другой - просто проверять время в основном цикле программы.
Каким тогда ещё способом можно это сделать?
(Reply) (Parent) (Thread)
[User Picture]From: sky_thunder
2007-05-22 05:42 pm (UTC)
У Вас в программе должен быть цикл, в котором Вы проверяете состояние мыши и клавиатуры и выполняете какие-то действия в соответствии с этим. Там же можно и вставить проверку времени. Как именно узнать время - это вопрос десятый. Да, time для этого подходит.

(Reply) (Parent) (Thread)
From: smilingcrank
2007-05-22 05:48 pm (UTC)
А, ну собсна я всё так и делаю, и именно про time спрашивал, поскольку никогда раньше не использовал. Тогда всё понятно. Спасибо.
(Reply) (Parent) (Thread)
From: ex_k0wax101
2007-05-22 05:07 pm (UTC)
памоиму такое без тредов/форков на чистом си не сделать, если что-то будет лочить прогу, то это никак не отодрать от mainloop'а.
другими словами non-blocking не будет.
про асм не знаю, про венду не знаю =)
(Reply) (Thread)
From: smilingcrank
2007-05-22 05:28 pm (UTC)
Много непонятных слов %)) Но вообще, похоже, можно довольно просто это сделать (вот сейчас как раз пытаюсь).
(Reply) (Parent) (Thread)
[User Picture]From: nigative
2007-05-24 04:08 am (UTC)
нужно создавать отдельный процесс/тред, иначе никак желаемого не добьёшься ("чтобы функция вызывалась независимо от основной части программы")
(Reply) (Parent) (Thread)
From: smilingcrank
2007-05-24 09:24 am (UTC)
да, я уже разобрался, спасибо. в Линуксе такое вытворял, но прогамка то досовая. к тому же уже написал таймер по другому (см. послежний комент к посту)
(Reply) (Parent) (Thread)
[User Picture]From: nigative
2007-05-24 04:25 pm (UTC)
ну функция таймер это одно, а запускать её, чтобы она не блочила основной тред это уже другое =) Ну если вытворял, то всё ок.
(Reply) (Parent) (Thread)
[User Picture]From: sky_thunder
2007-05-22 06:08 pm (UTC)
В однозадачной или кооперативной среде разработчику приходится заботиться о том, чтобы не блокировать поток надолго. Например, длительные задачи приходится разбивать на части и выполнять по таймеру.
(Reply) (Parent) (Thread)
[User Picture]From: spbgwg
2007-05-22 06:32 pm (UTC)
*ни bp, ни bc под рукой не имею*
помниться было такое: getintvec/setintvect, или около того...
*сорри за кривой коммент*
(Reply) (Thread)
From: smilingcrank
2007-05-22 08:48 pm (UTC)

ОТЧЁТ (чтобы не отвечать на новые комменты х))

Реализовал таймер с помощью функции time() из библиотки
[Error: Irreparable invalid markup ('<time.h>') in entry. Owner must fix manually. Raw contents below.]

Реализовал таймер с помощью функции time() из библиотки <time.h>. Получилась такая функция:

int timer()
{
time_t static time1;
time_t time2;
double dif;

time(&time2);
dif=difftime(time2, time1);
if (dif>=1)
{ //выполняются нужные действия
time1=time2;
}
return(0);
}
(Reply) (Thread)