특정시간동안 루프를 돌리려는데요

ergo50의 이미지

안녕하세요,,,,

특정시간동안 루프를 돌리려고 하는데,, 환경은 LINUX입니다.

while( 30초) {
....
..
..
}

어떤식으로 코딩해야할지 난감하네요

루프탈출조건을 어찌 넣어야 할지 좀 알려주세요

부탁드립니다

ixevexi의 이미지

간단한 함수를 작성합니다.
time_set();
timer();

루프 들어가기전에
time_set(20second)
while( timer() )

정도면 되지 않을까요?
전역변수를 쓰는 거라 좋지 않을 수 있지만 ^^

C++이라면 객체하나만 만들면 겁나 쉬운데
제가 C는 잘 몰라서요

C++, 그리고 C++....
죽어도 C++

mach의 이미지

여러가지 방법이 있을 수 있습니다.
저는 그중 alarm() 시스템 호출로 구현한 사례를 권합니다.

int g_isTimeout = 0;

// 시그널 핸들러
static void [b]sig_alrm_handler[/b](int signo)
{
    g_isTimeout  = 1; // 글로벌
}

test()
{

    int timeout;

    timeout = 30; // 30 초 타임아웃

    if (signal(SIGALRM, [b]sig_alrm_handler[/b]) == SIG_ERR)
        시그널등록 에러;// 종료? 리턴?
     g_isTimeout  = 0; // 글로벌
     alarm(timeout); // 타임아웃을 파라메터로 등록
                               // 이 시스템호출이후 timeout만큼 초(second)가 지나면
                               // alrm_handler()함수가 호출되고 복귀하게됨
     while( ! g_isTimeout ) // !에 유의 한다. 알람 핸들러에서 1로 세팅하게됨
     {
           // 임의의 코드 수행
     }
     alarm(0); // 모든 alarm()호출을 초기화시킴

}

다른 방법으로는 다음과 같은 유형을 사용하는 것입니다.

test()
{
  int timeout = 30; // 30초
  struct timeval start, end, current;
  
  gettimeofday(&start, 0);
  end.tv_sec = start.tv_sec + timeout;
  // end.tv_usec = start.tv_usec........; // 마이크로초까지 가능하나 여기서는 생략
  while ( 1 ) 
  {
       gettimeofday(&current,0);
       if ( current.tv_sec - end.tv_sec => 0 )
            break;
        // 임의의 코드를 수행
   }
    
}

후자의 경우 글로벌 변수를 사용하지 않았습니다.

예를 들어 드린것은 각각 일장일단이 있겠습니다.
그 밖에 타이머를 사용하는 방법 setitimer()등이 있을 수 있습니다.
* 또한 위의 예제의 가정은 "임의의 코드 ..."에서 사용된 루틴이 무한루프
또는 블록킹(blocking)호출을 사용하지 않는다는 가정을 했습니다.
무한루프는 심각하며(코드를 복잡하게 만들게 됨), 모든 블록킹 시스템 호출의
경우는 아무거나 시그널(여기서는 알람시그널)을 받으면 빠지게 되어 있으므로,
전자를 사용하시면 무리없으리라 여겨집니다.

보탬이 되었기를 ..

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

ergo50의 이미지

정말 많은 도움이 되었습니다.
도움주신분들께 정말 감사드립니다.

좋은하루되세요

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.