C++ фонов таймер

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <time.h>

using namespace std;
using namespace System;

void wait ( int seconds )
{
  clock_t endwait;
  endwait = clock() + seconds * CLOCKS_PER_SEC ;
  while (clock() < endwait) {}
}
void timer()
{
    int n;
    printf ("Start\n");
    for (n=10; n>0; n--) // n = time
    {
        cout << n << endl;
        wait (1); // interval (in seconds).
    }
    printf ("DONE.\n");
    system("PAUSE");
}
int main ()
{
    timer();
    cout << "test" << endl; // run rest of code here.}

  return 0;
}

Опитвам се да създам таймер в C++, който да работи във фонов режим. Така че основно, ако погледнете „главния блок“, искам да стартирам таймера (който ще отброи до 0) и в същото време да стартирам следващия код, който в този случай е „тест“.

Както е сега, следващият ред от код няма да бъде изпълнен, докато таймерът не приключи. Как да накарам таймера да работи във фонов режим?

Благодаря за помощта предварително!


person Rob    schedule 19.03.2012    source източник
comment
Каква операционна система? Такива вече съществуват.   -  person Duck    schedule 20.03.2012
comment
О, няма значение, виждам какво се опитваш да направиш.   -  person Duck    schedule 20.03.2012
comment
Сигурни ли сте, че искате кодът на таймера да работи едновременно с другия ви код? Защото това означава, че ще трябва да научите многопоточност. Всеки път, когато стартирате два бита код едновременно в един и същ процес, има различни правила, които трябва да следвате, за да не им стъпват на пръстите. Има много начини, по които можете да го направите, без да изпълнявате два бита код едновременно, включително цикъл на събития или използване на съобщения на Windows.   -  person David Schwartz    schedule 20.03.2012
comment
По принцип това, което искам да направя, е да кажа на таймера да започне да работи и след като му кажа да започне да работи, искам да пусна останалата част от кода, без да се налага да чакам, докато таймерът приключи.   -  person Rob    schedule 20.03.2012
comment
Във Visual Basic обаче това беше доста лесно за изпълнение. Няма ли други (прости) начини за постигане на това?   -  person Rob    schedule 20.03.2012
comment
Колко сложен е кодът, който трябва да се изпълни, когато таймерът изтече? Колко взаимодейства с останалата част от системата?   -  person Kerrek SB    schedule 20.03.2012
comment
Е, трябва да регистрира натиснати клавиши, така че да, много е важно кодът да работи непрекъснато.   -  person Rob    schedule 20.03.2012
comment
Като странична бележка, обикновено смесването на iostream IO с stdio IO може да доведе до неочакван резултат.   -  person Mark B    schedule 20.03.2012
comment
Е, в този случай няма кой знае каква разлика. Но ще имам предвид, че те не вървят заедно за в бъдеще. Благодаря. linuxquestions.org/questions/programming-9/   -  person Rob    schedule 20.03.2012


Отговори (1)


C++11. Трябва да работи с VS11 бета.

#include <chrono>
#include <iostream>
#include <future>

void timer() {
    std::cout << "Start\n";
    for(int i=0;i<10;++i)
    {
        std::cout << (10-i) << '\n';
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    std::cout << "DONE\n";
}
int main ()
{
    auto future = std::async(timer);
    std::cout << "test\n";
}

Ако операцията, извършена в timer(), отнема значително време, можете да получите по-добра точност по следния начин:

void timer() {
    std::cout << "Start\n";
    auto start = std::chrono::high_resolution_clock::now();
    for(int i=0;i<10;++i)
    {
        std::cout << (10-i) << '\n';
        std::this_thread::sleep_until(start + (i+1)*std::chrono::seconds(1));
    }
    std::cout << "DONE\n";
}
person bames53    schedule 19.03.2012
comment
Точността (ако дори е важна, тъй като OP има само цикъл с 10) ще намалее, тъй като това се изпълнява, тъй като не отчита колко време отнема cout да влезе в конзолата. - person Joe; 20.03.2012
comment
Наистина не търся изключителна точност, но не мога да използвам този код, тъй като използвам VB10 и не мога да включа ‹chronos› по една или друга причина. Благодаря за помощта ти все пак, bames! (Имайте предвид, че имам малко познания по C++!) - person Rob; 20.03.2012
comment
@Rob VS не е имал <chrono> преди 11. Нито <future> IIRC. Можете да получите VS11 beta безплатно, ако не сте останали на 10 по други причини. - person bames53; 20.03.2012
comment
@Joe Добавих версия, която ще вземе предвид колко време отнема започването на операцията, стига да не е повече от интервала от една секунда. - person bames53; 20.03.2012
comment
Някаква идея как да накарам 'std::this_thread::sleep_until' да работи в xcode? Получавам „Няма член с име this_thread в пространство от имена std“. - person Idan Moshe; 18.12.2013
comment
@IdanMoshe трябва да зададете стандартната библиотека на libc++ в настройките за компилация за вашия проект. - person bames53; 19.12.2013
comment
@bames53 'std::cout' -› няма член с име cout (замених го с printf), промених C++ Standard Library на libc++, както казахте, и също промених C++ Language Dialect на компилатор по подразбиране и C Language Dialect на компилатор по подразбиране . Както в проект, така и в цел и все още не е разпознат. - person Idan Moshe; 19.12.2013
comment
@IdanMoshe направи ли #include <iostream>? Ако е така, изглежда, че нещо се е объркало с вашия проект. Опитайте да стартирате нов проект за команден ред на C++. - person bames53; 20.12.2013