Форум программистов CodeGuru
16 Октябрь 2018, 16:05:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1] 2   Вниз
  Печать  
Автор Тема: VC++ 6  (Прочитано 24607 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mr X
Пользователь
***
Офлайн Офлайн

Сообщений: 32


Просмотр профиля
« : 30 Июль 2006, 11:51:32 »

У меня вопрос:
Существуют ли функции, замеряющие время?
Ситуация такая. Нужно в переменную записать время, а потом в других функциях проверять, не прошло ли, например 5 секунд.
Записан
ShumiArrow
Новичок
*
Офлайн Офлайн

Сообщений: 4


Просмотр профиля
« Ответ #1 : 30 Июль 2006, 20:42:30 »

Привет, Mr X!

Как вариант можно использовать таймер. У него установлено время срабатывания события Tick. Как только оно срабатывает ты просто считываешь текущее время, вычитаешь из него то, которое запомнил в переменной и сравниваешь с тем, что тебе надо. Как только наступит момент когда разница = 5 сек например, вызываешь свою обработку.

Вот такой код я полчил при создании Windows Application:
   private: System::Void timer1_Tick(System::Object *  sender, System::EventArgs *  e)
          {
             System:: DateTime time;
             time = System:: DateTime::Now;
             Form1::Text = time.ToString();
          }
Это событие срабатывания таймера.
« Последнее редактирование: 30 Июль 2006, 20:42:59 от shumiarrow » Записан
Mr X
Пользователь
***
Офлайн Офлайн

Сообщений: 32


Просмотр профиля
« Ответ #2 : 30 Июль 2006, 21:12:55 »

Спасибо ShumiArrow, что откликнулся!

и все же у меня возникло несколько вопросов:

1. Это точно С++?
2. Что такое сообщение Tick? В ClassWisard я нашел только WM_TIMER и WM_TIMECHANGE.
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #3 : 30 Июль 2006, 22:43:19 »

Цитировать
1. Это точно С++?

Это C# (.NET фреймворк используется).

Цитировать
2. Что такое сообщение Tick? В ClassWisard я нашел только WM_TIMER и WM_TIMECHANGE.

Видимо, это ближе к тому, что Вам надо.
Только вот WM_TIMECHANGE - совсем не то. Оно посылается когда меняется системмное время. Например, юзер часики перевел. Точнее даже так: сообщение WM_TIMECHANGE должно слать любое приложение, когда оно установит новое системмное время. А может и не слать вообще то.

WM_TIMER - сообщение от таймера.
Таймер запускается функцией
Код:
UINT_PTR SetTimer(
   HWND hWnd,
   UINT_PTR nIDEvent,
   UINT uElapse,
   TIMERPROC lpTimerFunc
);


убивается функцией

Код:
BOOL KillTimer(
   HWND hWnd,
   UINT_PTR uIDEvent
);


Функция SetTimer позволяет запустить таймер либо "в режиме" посылки сообщений окну (когда в функцию передается параметр hWnd, либо "в режиме" вызова callback-функции (когда hWnd = NULL), но передается lpTimerFunc.
Сообщение WM_TIMER шлется (либо вызывается lpTimerFunc) через uIDEvent миллисекунд.

Но опять же, это не совсем то, о чем Вы спрашивали.
Имхо,  Вам подойдет функция
Код:
void GetSystemTime(
 LPSYSTEMTIME lpSystemTime
);

Ей надо передать указатель на структуру SYSTEMTIME:
Код:
typedef struct _SYSTEMTIME {
 WORD wYear;
 WORD wMonth;
 WORD wDayOfWeek;
 WORD wDay;
 WORD wHour;
 WORD wMinute;
 WORD wSecond;
 WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;

В полях которой после вызова функции будут содержаться значения текущего времени.
Записан

Mr X
Пользователь
***
Офлайн Офлайн

Сообщений: 32


Просмотр профиля
« Ответ #4 : 31 Июль 2006, 14:36:54 »

Используя этот код

Код:
typedef struct _SYSTEMTIME {
 WORD wYear;
 WORD wMonth;
 WORD wDayOfWeek;
 WORD wDay;
 WORD wHour;
 WORD wMinute;
 WORD wSecond;
 WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;

я получил сообщение о переопределении. Поэтому я объявил два указателя

Код:
_SYSTEMTIME *p_last_time;
_SYSTEMTIME *p_current_time;


и, где надо вставил функции

Код:
GetSystemTime(p_last_time);
GetSystemTime(p_current_time);


Как же теперь сравнить два объекта ? так?
Код:

if (p_current_time.wSecond-p_last_time.wSecond>5)


Записан
Aeron
Пользователь
***
Офлайн Офлайн

Сообщений: 49


Просмотр профиля
« Ответ #5 : 02 Август 2006, 01:12:37 »

Цитировать
Используя этот код
я получил сообщение о переопределении. Поэтому я объявил два указателя

Это просто 3V привел определение структуры как она определена в h-файлах Visual Studio. То есть структуру определять не надо. Можно просто написать:
Код:
SYSTEMTIME time;
GetSystemTime(&time);


Цитировать
Как же теперь сравнить два объекта ? так?
Код:
if (p_current_time.wSecond-p_last_time.wSecond>5)

Да, можно и так. Но в этой структуре, учтите, в каждом поле отдельное значение.
То есть, в поле wSecond секунды от 0 до 59, в поле wMilliseconds - миллисекунды от 0 до 999, в поле wHour - часы от 0 до 23, и.т.д. И если надо получить разницу в секундах между произвольными моментами времени, то надо учитывать, что wSecond при втором вызове GetSystemTime может быть меньше чем при первом.
Например, было времени 10 часов 20 минут, 59 секунд. Получили, в структуре SYSTEMTIME в поле wSecond значение 59. А через 5 секунд время будет 10:21, 4 секунды. И в wSecond при следующем измерении будет значение 4. Тогда получится p_current_time.wSecond-p_last_time.wSecond будет 4-59 = -55. Вот так. То есть надо ставить дополнительное условие и если p_current_time.wSecond-p_last_time.wSecond меньше 0, то прибавлять к этому значению 60.
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #6 : 04 Август 2006, 23:25:18 »

Кстати, если используется MFC, то можно применять классы CTime и CTimeSpan. CTimeSpan  как раз класс для хранения разницы между двумя CTime. В CTime можно получать текущее время:
Код:
CTime t = CTime::GetCurrentTime();

И у класса CTime есть операторы +, -, +=, -=.
Код:
// Example for CTime::operator  +, -
CTime t1( 1999, 3, 19, 22, 15, 0 ); // 10:15 PM March 19, 1999
CTime t2( 1999, 3, 20, 22, 15, 0 ); // 10:15 PM March 20, 1999
CTimeSpan ts = t2 - t1;             // Subtract 2 CTimes
Записан

Mr X
Пользователь
***
Офлайн Офлайн

Сообщений: 32


Просмотр профиля
« Ответ #7 : 05 Август 2006, 01:10:23 »

Спасибо большое, все работает
Записан
Mr X
Пользователь
***
Офлайн Офлайн

Сообщений: 32


Просмотр профиля
« Ответ #8 : 20 Август 2006, 11:23:51 »

Еще один вопрос: можно ли при создании проекта MFC задать размеры окна? Если нет, то как изменить код программы, чтобы достичь этого же результата???
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #9 : 20 Август 2006, 18:11:58 »

Цитировать
Еще один вопрос: можно ли при создании проекта MFC задать размеры окна?

Конкретные размеры - нет.
Можно задать, будет ли окно максимизировано/минимизировано.
Цитировать
Если нет, то как изменить код программы, чтобы достичь этого же результата???

Можно использовать API функцию MoveWindow или метод CWnd::MoveWindow.
Можно использовать API функцию SetWindowPos или метод CWnd::SetWindowPos.
В первом случае надо будет задать еще координаты левого верхнего угла окна.
Во втором случае - можно указать флаги, чтобы координаты окна не менялись.
Записан

Mr X
Пользователь
***
Офлайн Офлайн

Сообщений: 32


Просмотр профиля
« Ответ #10 : 21 Август 2006, 11:36:36 »

спасибо, попробую разобраться

А почему не работает этот код (в смысле ошибки возникают)

Код:

#include <iostream>
#include <fstream>

using namespace std;

void rus_read(char namefile[], char &returned)
{
int n(0);

ifstream in(namefile, ios::in | ios::binary);

while(in.get(returned[n++])) {;}

return;
}
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #11 : 22 Август 2006, 21:26:11 »

Может быть, так надо:
Код:
void rus_read(char namefile[], char *returned)
{
int n(0);

ifstream in(namefile, ios::in | ios::binary);

while(in.get(returned[n++])) {;}

return;
}

именно:
Код:
void rus_read(char namefile[], char *returned)

Как я понимаю, массив returned должен заполняться.
Метод get требует ссылки на char.
Тогда функцию можно будет вызвать так:
Код:
char buf[1024];
rus_read("fff.txt", buf);
Записан

Mr X
Пользователь
***
Офлайн Офлайн

Сообщений: 32


Просмотр профиля
« Ответ #12 : 23 Август 2006, 11:23:23 »

спасибо, работает
Записан
Mr X
Пользователь
***
Офлайн Офлайн

Сообщений: 32


Просмотр профиля
« Ответ #13 : 30 Август 2006, 16:24:27 »

А можно как-нибудь отключить строку "press any keysto continue"???
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #14 : 30 Август 2006, 22:40:53 »

Мне кажется, нет. Это, наверно, CRT выводит. Хотя, может, я ошибаюсь.
Думаю, если из своего процесса создавать консоль, то никаких сообщений не будет.
Записан

Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!