[완료] Qt 좀 도와주세요.

pogusm의 이미지

1. 랜덤숫자레이블, 1번레이블,2번레이블, .... 5번레이블, 시작버튼, 멈춤버튼, 초기화버튼이 있습니다.

2. 시작버튼을 누르면, 1~5사이의 랜덤 숫자가 "랜덤숫자레이블"에서 빛의 속도록 변합니다.
동시에, 1번레이블~5번레이블에는, 각 숫자가 몇번 나왔는지 count됩니다.

3. 창을 옮기거나, 창의 크기를 줄이는 도중에도 위의 작업은 멈추지 않고 계속 진행됩니다.

4. 멈춤버튼을 누르면, 딱 멈춥니다.

5. 초기화버튼을 누르면 초기화됩니다.

근데, 실행하면 안됩니다.. ㅠㅠ
아마도, while(1) 실행도중에는 일일히 레이블을 재출력해주지 않아서 인것 같습니다.

조금 손좀 봐주세요.. (소스파일 첨부합니다)

혼자 공부하는 C/C++ 초보라서 좀 막막합니다.

감사합니다.

File attachments: 
첨부파일 크기
Package icon random.zip3.55 KB
klara의 이미지

GUI는, GUI 쓰레드에서 (추상적으로) 이벤트가 발생하기를 대기하다가 이벤트가 발생하면 이벤트를 처리하고 화면을 업데이트하고 다시 대기하고를 반복합니다.
on_pushButton_start_clicked() 함수는 현재 GUI쓰레드에서 실행되는 함수인데, 이 함수안에 무한루프가 들어있으면,

버튼 클릭->이벤트 발생->on_pushButton_start_clicked() 실행->안에서 무한루프

가 될뿐, 이벤트를 처리하고 화면을 업데이트하는 곳으로 갈수가 없습니다.
한번 시험삼아 무한루프가 아니라 10번만 루프돌리고 루프를 나가도록 해보세요.
그럼 최종결과만 적용되어 화면에 표시될 것입니다.

해결방법은 두가지인데, 하나는 별도의 쓰레드를 이용하는것이고, 다른하나는 타이머 클래스를 이용하는 방법입니다.
쓰레드를 이용하는 방법은 번거롭기도하고 쓰레드에 대해 이미 알고 계시다면 이런 실수를 하지 않으셨을테고, 어차피 메인쓰레드와 동기하는 방식으로 작동해야하니 성능면에서도 별다른 메리트가 없습니다.
그래서 쓰레드보다는 타이머를 이용하는 방법을 추천합니다.
QTimer라는 클래스를 이용하면, 일정 시간마다 특정 슬롯을 실행시키는게 가능합니다.
이 슬롯내에서 라벨을 '한번씩만' 수정하게 합니다.
QTimer는 일정시간마다 실행하므로 그때마다 한번 수정하면 종료할때까지 계속 반복될 것이고, 시간 간격마다 이벤트가 처리되어 화면도 업데이트됩니다.
'빛의 속도'라고 하신 매우 빠른 속도라는게 왜 필요한지 모르겠지만, GUI라는게 들어온 시점에서 그런건 이미 불가능합니다.
QTimer에서 시간 간격을 매우짧게 한다면 사용자의 CPU가 처리할수 있는 한도내에서 사용자눈에는 충분히 따라갈수 없을만큼 빠른 속도로 바뀌는걸 볼수 있을 것입니다.

pogusm의 이미지

친절한 답변 감사합니다.

말씀대로,
QTimer Class Reference 를 참고하여,
아래소스처럼 작성해 보았습니다.(영어를 몰라서 예제만 참고했습니다)

배열초기화 방법도 모르고, slot생성 방법도 몰라서..
count[0]=0; count[1]=0; count[2]=0; count[3]=0; count[4]=0; 처럼 초기화 하고,
slot도 그냥 widget.h 파일에 직접 작성했습니다.
(어렴풋한 기억으로 비쥬얼C에서는 멤버함수같은걸 자동으로 생성 가능했던거 같은데.. qt에선 그런게 없나요? ㅋ)

시간되시면 조금만 손봐주실순 없을까요?
(기본틀을 잘 몰라서, 실행은 되지만 제대로된 소스인지 확신이 안서네요..)

감사합니다.

댓글 첨부 파일: 
첨부파일 크기
Package icon random소스.zip3.79 KB
Package icon randomt실행파일.zip25.06 KB
klara의 이미지

on_pushButton_start_clicked()안에서 타이머를 생성하고 슬롯을 연결하고 있는데, 그러면 시작버튼을 누를때마다 새로운 타이머가 생성됩니다.
논리적으로 정지시킬때 이전 타이머는 정지시키고, 타이머를 만들때 부모인스턴스를 넘기고 있으므로 메모리 누출도 없겠지만, 불필요한 타이머가 계속 생성되고, 만약 매우매우 장기간 이걸 반복하면 메모리가 부족해질수도 있겠지요.
반복해서 쓰는 타이머이므로, 그냥 생성자에서 타이머도 만들고 슬롯도 연결시켜두면됩니다.
QTimer::start()를 실행하지 않는한, 슬롯이 연결되어있다고 지멋대로 슬롯을 작동시키지는 않으니까요.

우선 비쥬얼C라는 건 없고요, 비쥬얼C++을 말씀하신듯합니다.
비쥬얼 C++은 툴입니다. Qt는 라이브러리(프레임워크, 툴킷)이구요.
Qt와 비교를 한다면 비쥬얼 C++보다는 MFC와 비교를 해야겠지요.
예를 들어, 비쥬얼 C++을 이용하여 Qt를 가져다 쓰는것도 가능합니다.

자동화된 툴이 많은 수고를 덜어주고, 자동으로 코드를 생성하는 만큼 오타등으로 인한 실수를 없애주기도 합니다만, 반대급부도 큽니다.
자동화된 툴에대해서인데, 적으신 글이 바로 그러한 폐해를 나타내고 있습니다.
가장 큰 문제로, 본인이 무엇을 하고 있는지 모른다는 것입니다.
비쥬얼 C++이란 걸로 프로그래밍을 하고 있는데, 이게 무엇을 하는 놈인지는 모르지만 뭔가 끄적끄적하니까 뭔가 움직인다, 가 되버립니다.
개인적으로 충격적이었던 경험으로은, 취미로 프로그래밍한다고 C++을 막떼고 바로 Visual C++가지고 놀다가, class의 선언문조차 까먹은 자신의 모습에 경악한적이 있습니다.
그 이후로 코드를 자동으로 생성하는 툴에대해서는 안좋은 인상을 가지게 되었습니다.
그래서 디자이너를 쓸때도, on_name_slot 같은 형식으로 슬롯을 만들어서 자동으로 슬롯이 연결되게 하는 것도 별로 선호하지 않습니다.
차라리 디자이너 내부에서 완결할수 있는 시그널/슬롯 연결이라면 적극적으로 활용하지만, 내가 작성한 코드와 연결하는걸 자동으로 되게 하고 싶지는 않습니다.
하지만 편리한 기능들임에는 분명하므로, 잘 이해하고 쓴다면 문제없겠지요.
클래스 하나 만들자고 매번 해더파일 소스파일 만들고 프로젝트에 추가하는 짓을 반복하는건 정말 귀찮은 일이니까요.

질문에 답변하자면, Qt자체는 그러한 툴을 가리키는 것이 아니므로, 질문은 'Qt를 지원하면서 멤버함수를 자동으로 생성해주는 IDE'에 대한 것이될 것이고, 그러한 툴로는 위에서 적은 비쥬얼 C++도 있고, 이클립스도 가능했던거 같습니다.
제가 아는한에서 노키아에서 밀고 있는 QtCreator에는 클래스 생성기능은 있지만 멤버함수 생성기능은 없는거 같습니다.
CodeBlocks에도 있는거 같고... 리눅스에 한정한다면 KDevelop도 훌륭한 툴입니다.

pogusm의 이미지

생성자에
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(run()));
를 옮겨놓는게 더 좋은거군요.

그리고, 멤버함수등을 자동으로 생성해주는건 비쥬얼C++이란 툴이 제공하는 기능인거군요..
그냥 *.h 파일과 *.cpp 파일을 왔다갔다하면서 멤버함수를 선언하고 하는게 틀린 방법이 아니군요 ㅋ

이래저래 큰 도움이 되었습니다.
저렇게 만든 소스를 기반으로 제가 작성하고 싶었던 프로그램을 함 만들어 봐야겠습니다.

정말 고맙습니다. ^^

ps. timer->start(1); 이었던것을 timer->start(0); 으로 수정하니 더 빨라지네요 ㄷㄷ

klara의 이미지

QTimer가 밀리초단위를 지원하긴하지만, 그렇다고 정말 밀리초단위의 정확도가 있는 건 아니고 사용하는 환경에 따라서 달라집니다.
간격을 0으로 설정하는 것은, '가능한한 빨리'라고 요청하는 것입니다.

댓글 달기

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