C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[46147] Re:Re:Re:Re:볼랜드툴이 원래 그런가요?(스레드관련)
최우성 [] 1467 읽음    2006-08-11 19:58
오홋~ 이런걸 원했습니다.  ^^;

그런뜻이 있네요.. 개념없이 구성했긴 하지만 .. 그렇다고 너무 개념없이 한건 아닌데 ㅎㅎ

포스트메세지는 님의 말씀처럼 수정햇습니다. 의심은 갔었는데.. 어떻게 몸에 확~와닿게 느낄만한 코딩을 하지못했네요

코딩하면서 약간 꺼끄러운 면들이 있긴 했는데 그게 다 버그이겠죠...

님의 말씀대로 수정해서 프로그램 살려야겠습니다. ^^;;

감사합니다.

참!  그렇다면 컴텨마다 특성타는건 포스트메세지때문일까요???
sleep(X) 함수는 정확하던데 컴텨 기종과 다르게..말입니다.


구대원 님이 쓰신 글 :
: 스레드 안에서 Sychronize(func) 식으로 하는 경우에
: func함수의 내용은 멀티 스래드로 동작하지 않습니다.
:
: Synchronize기능은 Form과 같이 공동으로 쓰는 자원을 이용할때 다른 스래드와 서로 방해하지 않을때만 사용해야 합니다.
: Synchronize 안에 주요 기능이 들어있다면 멀티 스래드로 동작하지 않습니다.
:
: 그리고 Application->ProcessMessages() 기능은 멀티 스래드 환경에서 되도록 사용하지 않는것이 좋습니다.
: 순차적으로 진행되어야 할 프로그램에 엉뚱한 기능이 중간 중간 실행될 수 있습니다.
: 예를 들면 사용자가 버튼을 마구 누르는 경우에 버튼 이벤트가 끝나기 전에 이벤트가 중복 실행될 수 있습니다.
:
: 화면 갱신을 위해서라면 화면 갱신 메세지만 수행하도록  메세지 루프를 만드시고 돌리는게 나을 것입니다.
:
: 특정 UI에 메세지나 값을 표시 하려면 SendMessage()로 메인폼에게 메세지를 보내서 처리하도록 하시면
: 구지 Synchronize 기능을 사용하지 않으셔도 됩니다.
: window message의 처리는 동시에 일어나지 않기 동시에 마구 sendmessage 하더라도 처리하는곳에서는 순서대로 처리합니다.
: 따라서
: while(!Terminated)
: {
:     주요 연산...
:     필요에 따라서 Sleep 같은거 사용 가능 SleepEx()쓰면 더 좋습니다.
:     Synchronize(UI관련기능);
: }
:
: UI관련기능()
: {
:    최대한 짧은 시간동안 실행..
:    Sleep 같은거 하지 말기..
: }
:
: 또는
: while(!Terminated)
: {
:    주요 연산...
:    SendMessage(form_handle, WM_USER같은거,  나만의코드, (LPARAM)"나만의데이터" // 문자열은 이런식으로);
: }
:
: 도움이 되었나 모르겟네요.
: 그럼 즐프 하세요.
:
: 최우성 님이 쓰신 글 :
: : 미안합니다. 질문이 좀 그렇네요 ^^;
: : 질문 내용은 이렇습니다.
: : 일단 문제라고 보는건...
: :
: : EX) 테스트환경
: : => timer 를 구동합니다. 100ms로 인터럽트 구동합니다. 100ms 씩 에디터 박스에 글자를 표현합니다.
: : 그럼 1초동안 10개나옵니다.
: :
: : 1) 제가 사용하는 피씨에서는 퍼포먼스가 나옵니다.
: :      -> 물론 제피시환경에서 개발하고 버그 잡고 테스트하니 문제가 없다고 봅니다.
: :      -> 에디터 박스에 10개의 글자가 잘 나옴니다.
: :
: : 2) 다른 피시에서는 안되는경우가 종종있다.
: :     -> 어느 피시(테스크탑)에서는 제 피씨 에서 나온만큼 성능을 내줍니다. 에디터 박스에 10개의 글자가 모두찍힘
: :     -> 특정 노트북에서는 속도가 느리다.(엄청) , 에디터박스에 7~8개정도 글자가 나옴니다.
: :
: : *** 볼랜드 툴로 개발해야겠다는 생각이 들면 위의 내용과비슷하게 부하를 걸어보면서 성능을 테스트 해보았습니다.
: : 초기 딸랑 폼하나에 타이머 하나 에디터박스하나면 가볍다고 생각합니다.
: : 현재 완료된상태는 메인 스레드 하나에 타이머가 3개 에 그래프에 TAB 합이 6개입니다. 물론 운영할때는 (스레드 + 타이머1개 + TAB1) 이렇게  됩니다.
: :
: : 그런데 문제가 발생한게 다른 노트북사양에서  속도 차이가 생긴다는 겁니다.
: : 1초에 100ms 씩 10개가 모두 잘 체워져야하는데... 7~8개씩 체워지는 현상입니다.
: :
: : - 이렇게 답답하게 말씀드리면 콤포넌트나 로직이 잘못됬었다고 판단되나.. 제컴에서는 이상이 없으니 에러대체가
: : 안대어있구요....
: :
: : 로직은 모듈별 전형적으로 구성하는 방법입니다......
: :
: : 메인 스레드는
: :         while(!Terminated)
: :         {
: :                 Synchronize(callSyn);
: :         }
: : // 뭐 이런식입니다. 타이머도 영향을 안받을거고...
: : 폼의 콤포넌트는 LMD 프리 버젼을 주로 사용했습니다. 그것도 문제 안된다고 봅구요...
: : 스레드에서 하는일은 usb에서 데이터를 확인하는겁니다.
: : 들어오는 데이터가 10바이트라면 첫번째 1바이트받기 위해서 1초를 기다리게 합니다.(제컴에서는)
: : 그다음 타임오버값을 100ms를 주고 100ms안에 9개 데이터를 받지 못하면 FAIL처리 하는 구조입닏.
: : 1초가 오버타임이지만 오버타임 걸린적은 물론 없습니다.
: : 그런데 다른 피시에서는 1초에 받지 못하고 5초정도 여유를 줘야 받아냅니다. 전 이게 궁금해서 질문드리는겁니다.
: : 10바이트 수신부은 while(1) 문입니다. 물론 while문 안에 Application->ProcessMessages();
: : 까지 삽입했습니다.
: :
: : 프로그램 다시 내리게 생겻습니다. 으윽... 개인 프로젝트라 별문제는 없지만 몇주 밤샘하면서 작성했던건데
: : 버리기엔 너무 아까워서 그럼니다....
: :
: :
: :
: :
: : 왕대박 님이 쓰신 글 :
: : : 개인적으로 거의 대부분의 프로젝트를 C++Builder로 수행했지만, 모두 성공적이었습니다.
: : : 컴포트 12개이상를 오픈하여 통신하는 프로젝트도 잘 되고 있고,
: : : 많은 수의 소켓으로 통신하는 프로젝트도 잘 되고 있고,
: : : 하나의 어플에서 이종의 여러개의 DB의 데이터를 취합하는 프로젝트도 잘 되고 있고,
: : : 여러개의 DAQ카드를 모니터링 & 제어하는 프로젝트도 잘 되고 있고,
: : : 그래픽파트에서 OpenGL으로 표현하는 프로젝트 역시 아직도 잘~ 돌아가고 있습니다.
: : :
: : : >>결론적으로 볼랜드 툴은 원래 그렇지 않습니다.
: : : 질문내용만으로는 정보가 부족해서 도움을 드릴 수가 없군요.
: : :
: : : 마지막으로 같은 개발툴을 사용한다는 것만으로도 상당히 반가운 일입니다만,
: : : 님처럼 질문제목을 달고서 명쾌한 답변을 원하시는 것은  상당한 무리가 있습니다.
: : : 다시한번 잘~ 살펴보세요. 답은 항상 상식선에서 있습니다.
: : : 그럼, 즐프하세요.
: : :
: : : 최우성 님이 쓰신 글 :
: : : : 폼 디자인 하기 쉽고 이뿐콤포넌트들이 많아서 볼랜드 툴로 프로그램했는데요..
: : : :
: : : : 완성해놓고 문제점이 생겼습니다.
: : : :
: : : : 개발한 컴텨는 IBM T40에 램 512에서 아무탈없이 테스트하고 개발 했는데요..
: : : :
: : : : 문제는 다른 노트북에서 프로그램을 돌리니....  버버벅.....
: : : :
: : : : 제컴 1ms가 다른 컴텨 10ms정도 (느낄정도) 됩니다....원하는 결과는 물론 안되는거죠..
: : : :
: : : : 추측컨데 스레드쪽이 의심가는데....
: : : :
: : : : 로직은 이러합니다.
: : : :
: : : : 프로그램실행하게 되면 스레드는 일단 멈춰있는 상태이며 런!을 하면 스레드는 데이터 수신을 위해서
: : : :
: : : : 종료될때까지 운영됩니다. 물론 중간중간 데이터가 없으면 스레드쪽에서 리턴을 시키기 때문에 문제는 없을거라
: : : :
: : : : 보는데...
: : : :  이런 부분을 접해보신분 있습니까??  아무말씀이라도 좋은니.... 도움좀 부탁드림니다..
: : : : 이거원 프로그램이 몇주 투자한게 아까워서라도 원인을 찾고 싶은데요....

+ -

관련 글 리스트
46134 볼랜드툴이 원래 그런가요?(스레드관련) 최우성 1019 2006/08/10
46135     Re:볼랜드툴이 원래 그런가요?(스레드관련) 왕대박 1183 2006/08/10
46137         Re:Re:볼랜드툴이 원래 그런가요?(스레드관련) 최우성 1347 2006/08/11
46143             Re:Re:Re:볼랜드툴이 원래 그런가요?(스레드관련) 구대원 1490 2006/08/11
46147                 Re:Re:Re:Re:볼랜드툴이 원래 그런가요?(스레드관련) 최우성 1467 2006/08/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.