[질문] while() 루핑시 cpu 100% 문제

psycoder의 이미지

다음 소스와 같이 백그라운드로 일정주기 동안 일정 간격으로 뭔가를 실행하는 프로그램을 만들려고 합니다.

int main()
{
	SYSTEMTIME st;
	GetLocalTime(&st);

	while(1)
	{
		if(st.wHour>8 && st.wHour<17 && st.wMinute/2==0)
		{
			printf("%d:%d:%d:%d\n", st.wMonth, st.wDay, st.wHour, st.wMinute);
		}
		else if(st.wHour>8 && st.wHour<17 && st.wMinute/3==0)
		{
			printf("%d:%d:%d:%d\n", st.wMonth, st.wDay, st.wHour, st.wMinute);
		}
		else
		Sleep(0);
	}
}

위에서 처럼 Sleep(0);를 해주면 cpu 100% 문제가 해결된다고 들었는데 실행하면 100% 잡아먹네요.
그리고 실행하면 printf()가 실행되지 않는걸로 봐서 아마두 if()문이 실행되지 않는거 같습니다.
그래서 cpu를 100% 잡아 먹는거 같구요.
근데 위 소스에서 잘못된게 있나요?
전 눈씻고 찾아봐두 모르겠네요. :oops:

제가 구현하고자 하는건 백그라운드로 돌면서 하루 24시간중 특정 시간대 몇분 주기로 뭔가를 실행하고 나머지 시간중 또 몇분주기로 뭔가를 실행하고자 합니다.

백그라운드로 도는건 while()로 하면 될줄 알았는데 cpu100% 문제가 생기고 특정주기로 실행되는건 위처럼 if()로 하면 될줄 알았는데 전혀 if()안의 조건이 수행되지 않는거 같구..답답하네요..

Rica의 이미지

int main() 
{ 
   SYSTEMTIME st; 

   while(1) 
   { 
      GetLocalTime(&st);

      if(st.wHour>8 && st.wHour<17 && st.wMinute/2==0) 
      { 
         printf("%d:%d:%d:%d\n", st.wMonth, st.wDay, st.wHour, st.wMinute); 
      } 
      else if(st.wHour>8 && st.wHour<17 && st.wMinute/3==0) 
      { 
         printf("%d:%d:%d:%d\n", st.wMonth, st.wDay, st.wHour, st.wMinute); 
      } 
      else 
         Sleep(1); 
   } 
}

Sleep(0) 한다고 해서 정말 쉬는 건 아닙니다. 다른 프로세스가 덜 버벅일지는 모르겠습니다만 available cpu time은 전부 쓰게 되죠.

그리고 while 돌면서 계속 시간을 체크하셔야죠 :wink:

ssggkim의 이미지

psycoder wrote:

if(st.wHour>8 && st.wHour<17 && st.wMinute/2==0)

위에서 st.wMinute/2==0 이 의심이 가는데요. 밑에도 마찬가지고요.
제가 의도를 잘 파악했나 모르겠지만 /가 아니라 %가 아닐까 짐작합니다만...

서문일의 이미지

sleep 값을 0으로 하지 마시고..
1정도로 줘보시면 어떨까요.

윈도는 sleep이 어떤식으로 구현되는지 몰라서 정확하게
말씀 드리지는 모르겠지만 저는 보통 1정도로 줘서 합니다만..

cpu 100% 문제는 해결이 될듯합니다.

p.s if절에 sleep를 쓰지 말고 if절 외에 써보십시오.

bugiii의 이미지

윈도우에서 작업하시는지요?

윈도우라면 커널에서 제공하는 좋은 타이머를 제공할겁니다. 한번 알아보시구요. 무조건 Sleep을 호출한다고해서 점유율이 떨어진다고 하기에는 말하기 곤란한 점이 있다고 봅니다.

Sleep(0) 라고 하면 0ms 쉬고 다시 어플리케이션으로 제어가 넘어올텐데 점유율이 낮다고 하더라도 너무 낭비가 되는 듯하구요.

검사 간격이 아주 정밀해야 하지 않는 이상 1000 정도로 1초만 해도 충분하리라고 봅니다.

물론 타이머 쓰는 것이 더 좋겠죠...

kuma의 이미지

Waitable Timer Object 를 사용해보십시오.

이렇게 Polling 하시는건 윈도에서는 바람직한 방법이 아닙니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.