tuolesi Ответов: 3

Таймер в консольном приложении?


Существует ли класс timer для использования в консольном приложении c++?

Мне нужен таймер для задержки вывода данных пользователю.

3 Ответов

Рейтинг:
26

bleedingfingers

Sleep () - это простое решение. Однако это еще не все. Вы также можете сделать таймер из объекта ядра. Вы должны были бы использовать WaitForSingleObject (...), который принимает предполагаемые миллисекунды в качестве второго параметра. Следующий код печатается каждую секунду и отсчитывается в течение 10 секунд.

#include <windows.h>
void main()
{
    int nCount = 0;
    HANDLE hTimer = CreateEvent(NULL, FALSE, FALSE, NULL);
    while(nCount < 10)
    {
	WaitForSingleObject(hTimer, 1000);
	cout << "1 s\n";
	nCount++;
    }
    cout << "10 secs\n";
    CloseHandle(hTimer);
}


Это утомительно по сравнению со сном (), как я уже сказал, но все же это способ сделать это, особенно если вы хотите разорвать цикл ожидания из-за какого-то события, которое произошло. Следующий код иллюстрирует это.

#include <windows.h>
HANDLE hTimer = NULL;
unsigned long _stdcall Timer(void*)
{
    int nCount = 0;
    while(nCount < 10)
    {
	WaitForSingleObject(hTimer, 5000);
	cout << "5 s\n";
	nCount++;
    }
    cout << "50 secs\n";
    return 0;
}
void main()
{
    DWORD tid;
    hTimer = CreateEvent(NULL, FALSE, FALSE, NULL);
    CreateThread(NULL, 0, Timer, NULL, 0, &tid);
    int t;
    while(cin >> t)
    {
        if(0==t)
            SetEvent(hTimer);
    }
    CloseHandle(hTimer);
}


Если вы наберете ноль, то таймер будет немедленно отменен. Если нет, то он будет продолжать ждать по крайней мере 5 секунд.


Рейтинг:
2

neelbhai

#include "stdafx.h"
#include <Windows.h>
#include <iostream>

using namespace std;

BOOL quit = FALSE;

void timertick(int count)
{
	char buff[64];
	_itoa_s(count, buff, 64,10);
	cout << buff<<"\n";

}
DWORD WINAPI thread1(__in LPVOID lpParameter) {
	int nCount = 0;
	HANDLE hTimer = CreateEvent(NULL, FALSE, FALSE, NULL);
	while (!quit)
	{
		
			WaitForSingleObject(hTimer, 1000);
			//cout << "1 s\n";
			nCount++;
			timertick(nCount);
		
	}
	return 0;
}


int main()
{

	DWORD threadID1;
	HANDLE h1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread1, 0, 0, &threadID1);
	//HANDLE h2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread2, 0, 0, &threadID2);

	getchar();
	quit = TRUE;
	return 0;
}


Рейтинг:
13

Richard MacCutchan

Вы могли бы использовать Sleep() функция внутри цикла, чтобы задержать ваш процесс.