|
스레드 안에서 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정도 (느낄정도) 됩니다....원하는 결과는 물론 안되는거죠..
: : :
: : : 추측컨데 스레드쪽이 의심가는데....
: : :
: : : 로직은 이러합니다.
: : :
: : : 프로그램실행하게 되면 스레드는 일단 멈춰있는 상태이며 런!을 하면 스레드는 데이터 수신을 위해서
: : :
: : : 종료될때까지 운영됩니다. 물론 중간중간 데이터가 없으면 스레드쪽에서 리턴을 시키기 때문에 문제는 없을거라
: : :
: : : 보는데...
: : : 이런 부분을 접해보신분 있습니까?? 아무말씀이라도 좋은니.... 도움좀 부탁드림니다..
: : : 이거원 프로그램이 몇주 투자한게 아까워서라도 원인을 찾고 싶은데요....
|