qt && opengl && thread 질문입니다

qkrtntjd의 이미지

qt로 작업을 하고 있습니다

윈도우에 위젯을 띄우고 그 위젯에 공을 그리는 것인데 공의 위치에 따라 애니메이션을 돌리는 것 입니다.
공의 위치와 갯수는 텍스트 파일에서 받아옵니다.

그런데 애니메이션을 돌릴때 타이머가 좋을까요 쓰레드가 좋을까요?
타이머로 할때는 잘 되는데 스레드로 할 때 문제점이 몇가지 있습니다.
glwidget이라는 코드가 위젯에 그리는 코드를 담고 있습니다(paintgl, initializeGL, resizeGL 등등)
그런데 glwdiget안에 스레드를 생성해서 스타트 버트를 누르는 순간 스레드가 시작합니다
그러면 스레드에서 emit palyrender(glwidget 클래스내부함수)을 하여 프레임을 하나씩 증가시켜주어 애니메이션이 되도록 하였습니다
이렇게할 때 msleep을 안주면 마우스나 다른 이벤트가 거의 안먹는구요.. msleep(17)정도 주면 공의 갯수에 따라 잘 돌아갑니다..
원래 이런 프로그램을 개발할 때 스레드를 돌릴 때 msleep을 사용하나요?

한가지 더 여쭤볼 것이 있는데 스레드를 glwidget 클래스 내부에서 생성하지 않고
윈도우에서 스레드를 생성하여 그 스레드 내부에서 glwidget클래스를 생성하여 돌리는 것이 더 잘 될까요?
조언 부탁드립니다

shint의 이미지

QTableWidget 에 색상과 값 변경하기.zip
https://drive.google.com/file/d/0B_788O9A9oekTk16andqRGM4NTA/edit?usp=sharing

OpenGL로 테셀레이션 만들기
https://drive.google.com/folderview?id=0B_788O9A9oekaFEzeE1Za1hEQjg&usp=sharing

책보시는것이 좋습니다. ㅇ_ㅇ;;

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

qkrtntjd의 이미지

답변은 감사하지만 제가 알고싶은 것이 전혀 아닙니다

라스코니의 이미지

어떤 쓰레드 구조를 사용하시는 지 모르겠지만 event loop 방식이 아닌 경우에 msleep() 을 안주면 키보드나 마우스가 안먹게 되죠.
그래서 제가 사용하는 방식은 작업 쓰레드를 쓰레딩이 아닌 event loop로 들어가서 동작하게 만들고, 다른 timer 관리 모듈에서 주기적으로 (30, 60 Hz) 작업 시그널을 emit 해서 돌아가게 만들었습니다.

쓰레드라는 것이 task synchronization을 사용해서 스스로 yield하게 만들지 않으면 무한 루프에 빠지게 되죠.

제 생각에는 애니메이션 프레임을 만드는 작업을 만드시고 딴 모듈에서 timer를 운용해서 주기적으로 호출하는 것이 좋다고 봅니다.
그러면 job overloading, overrun에 대한 정보도 쉽게 얻을 수 있죠.

qkrtntjd의 이미지

스레드가 메인 프로세스와 별도로 돌아가는데 메인 프로세스에서 이벤트를 받게 해놓고 스레드는 msleep없는 상태라면 마우스 이벤트등이 안먹나요?
어차피 다른 프로세스에서 동작하는건데 이해가 안가네요.. cpu가 스레드에 올인하는것도 아니고 또한 스레드내부에서 마우스이벤트 처리를 한 것도 아닌데 이해좀 시켜주시면 감사하겠습니다

klara의 이미지

> cpu가 스레드에 올인하는것도 아니고
sleep이 없으면 context switching이 안일어나기 때문에 올인하게됩니다.

라스코니의 이미지

만드시는 프로그램이 하나의 메인 프로세스가 되는 것이고, 애니메이션 쓰레드는 그 프로세스 내에서 생성되어 돌게 됩니다. 그래서 그 쓰레드가 자체적으로 CPU 사용권을 반환하지 않으면 그 메인 프로세스는 계속 쉬게 됩니다.

아니면 multi proces로 만들어서 하나의 프로세스에서 UI를, 다른 프로세스에서 애니메이션 업데이트를... 이렇게 구분해야 하죠.

qkrtntjd의 이미지

그렇다면 더 나아가 어떤 스레드라도 msleep(1)이라도 존재하게 되는건가요? 뮤텍스나 세마포어와는 전혀 관련이 없는건가요?
(이것은 스레드간 기아현상 등을 막으려고 하는것으로 알고있습니다..)
지식을 넓혀주어 감사합니다.

라스코니의 이미지

하나의 프로세스에서 여러개의 쓰레드가 존재할 수 있는데 다른 스레드가 돌아가게 하기 위해서는 현재 돌아가고 있는 쓰레드가 CPU 자원을 양보 yield 하는 수밖에는 없죠. 아니면 중앙에서 타이머로 깨어나는 관리 쓰레드가 그 쓰레드를 멈춘다던지 다른 쓰레드의 우선순위를 높이던지 하던지 해야 하지요.

자발적으로 CPU 자원을 양보하려면 아래와 같은 방법을 쓸 수 있습니다.
- 시간 지연 타이머 API 호출 msleep(1) 등
- 다음 실행을 위한 신호 대기 SemAcquire() 등

이런 방법이 없이 무한 루프로 돌아가는 쓰레드는 우선 순위를 낮춰서 백-그라운드로 돌아가게 해야 다른 기능의 수행이 부드러워 집니다.

qkrtntjd의 이미지

답변 감사합니다

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.