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
[75849] Re:Re:Re:Re:Re:Indy TCP Server 에서 무한 루프를 동작 함수를 호출하는 경우...
김시환 [godson2] 1121 읽음    2020-05-11 15:11
답변 감사드립니다.
그런데 제가 원하는 것은 무한 루프를 단순히 빠져 나오는 것이 목적은 아닙니다. 원격에 의해 무한루프 안으로 들어간 상황에서 다음 원격 명령에 응답을 해야 하는데 무한루프 안에서 나오지 않는한 다음 원격 명령에 응답할 수 없는 문제에 대한 해결 방법을 찾고 있었습니다. 아래 빌더님 글에 의하면 현재 씨빌더에서는 불가능 한 기능으로 보입니다.

사실 제가 만드는 프로그램은 무한루프는 아니고 좀 시간이 걸리는 작업을 진행하고 종료하는 프로세스라서 그냥 클라이언트에게 실행명령하고 나면 끝날때 까지 다른거 날리지 말라고 얘기하던가 아니면 쓰레드 이용해서 수정하던가 해야 하겠습니다.


금목암 님이 쓰신 글 :
:
: 1. readbyte 하기전에 버퍼를 검사해서 수신된 것이 없으면 readbyte를 할 필요가 없죠
: 2. 타이머나 카운트를 이용하여 일정시간내 응답 없으면 강제로 나오기 [좀 복잡함]
: 3. 타임아웃 명령어가 있습니다  읽기시간을 ms로 주고 10ms내에 읽기가 실패시 통과 합니다
:
: ==========================
: 빌더(TWx) 님이 쓰신 글 :
: : 김시환 님이 쓰신 글 :
: : : 이 방법은 저도 해 봤는데 안됩니다.
: : : 프로세스 자체가 이 무한 루프에 갇혀 있는 형국이라 무한 루프를 나가기 전에는 응답을 못하네요..
: : :
: : : 물론 메인 폼에 변수를 하나 설정하고 TCP Server에서 응답을 하면서 변수만 바꿔 주고 메인 폼에 타이머 같은거 하나 두어서 주기적으로 해당 변수를 체크하고 있다가 LOOP 함수 동작에 대해 처리하면 동작은 되겠지만 아무래도 뭔가 찝찝한 코딩처럼 느껴져서 문의를 드립니다.
: : :
: : : 방법이 정 없다면 어쩔수 없이 사용해야 겠지만 뭔가 좋은 방법이 있으면 좋겠습니다.
: : : 
: : :
: : : 정성훈.해미 님이 쓰신 글 :
: : : : 루프안에 Application->ProcessMessage() 를 사용해서 처리하는 것이
: : : : 제일 간단한 방법일 것 같습니다.
: : : :
: : : : void __fastcall TForm1::LOOP()
: : : : {
: : : :     while(true)
: : : :     {
: : : :        if(m_UserStop == true) break ;
: : : :        Sleep(100) ;
: : : :        Application->ProcessMessage(); // 추가
: : : :     }
: : : : }
: : : :
: : : : 김시환 님이 쓰신 글 :
: : : : : Indy TCP Server 를 사용하여 프로그램을 하고 있습니다.
: : : : : 외부 클라이언트에서 특정한 동작 요청이 있을 경우 서버 프로그램은 무한 루프 함수를 실행하게 됩니다.
: : : : :
: : : : : 그런데 이렇게 될 경우 이 서버가 다른 클라이언트 요청은 정상적으로 수행하는데 이 무한루프 함수를 요청한 클라이언트의 다른 요청은 이 무한루프를 빠져 나가기 전에는 수행을 못합니다.
: : : : :
: : : : : 아래 코드의 상황 입니다.
: : : : :
: : : : : void __fastcall TForm1::TCPServerExecute(TIdContext *AContext)
: : : : : {
: : : : :     TIdBytes ABuffer;
: : : : :     AContext->Connection->IOHandler->ReadBytes(ABuffer, -1, false);
: : : : :     int action = Parsing(ABuffer) ;
: : : : :
: : : : :     if( action == 1) LOOP() ;
: : : : : }
: : : : :
: : : : : void __fastcall TForm1::LOOP()
: : : : : {
: : : : :     while(true)
: : : : :     {
: : : : :        if(m_UserStop == true) break ;
: : : : :        Sleep(100) ;
: : : : :     }
: : : : : }
: : : : :
: : : : : 결국 클라이언트의 요청이 완전히 동작 완료하기 전에는 동일한 클라이언트의 다른 요청에는 응답을 하지 못한다는 의미인데 이런경우 어떻게 해결하는 것이 좋을까요??
: : : : : Callback 같은 걸로 해결하는 방법이 있을까요?
: :
: :
: :
: :
: :
: : 답변:
: :
: :
: :
: : 델파이도 C++ 빌더도 어설프게 알고 있는 사람들이...
: : ProcessMessage()를 마치 무슨 만능이라도 되는 것 처럼 잘못 사용하고 있는 것 같은데요.
: :
: : 예를 들어...
: :
: : 리스트 박스에 대량의 데이타를 추가한 다고 할 때...
: : 리스트 박스 데이타 추가 동작이 일어 날 때 마다 리스트 박스 메세지가 디스페치 돼야 하는데
: : 싱글 쓰레드로 밖에 동작하지 못하는 VCL 라이브러리의 한계로 인해서
: : 메인 쓰레드 UI가 얼어 버리는 문제를 피해가기 위한 꼼수로 사용하는 방법이
: : ProcessMessage()를 이용하는 거고...
: :
: : 이 함수는 윈도우 메세지 들을 디스패치 하는 역할 밖에 하지 않습니다.
: :
: :
: :
: : 질문에 언급되어 있는 근본적인 문제를 해결하기 위해선 CoRoutine 이라는
: : 테크닉을 이용해야 하는데, C++ Builder 10.4 버전이 나온다고 하더라도
: : 엠바 컴파일러로는 적용할 수 없을 겁니다.
: :
: : 10.4 버전이 나와봤자 컴파일러는 C++17 그대로고, 런타임 라이브러리 버그만 패치 하는 수준에 그칠 것이므로.
: :
: : CoRoutine 테크닉은 VC++ 컴파일러 같은 C++20을 지원하는 컴파일러를 사용해야 하고
: : 비선점 방식으로 서브루틴 Yield를 가능하게 해주므로 질문에 언급되어 있는 근본적인 문제를
: : 해결할 수 있지요.
: :
: :

+ -

관련 글 리스트
75838 Indy TCP Server 에서 무한 루프를 동작 함수를 호출하는 경우... 김시환 1295 2020/04/24
75851     Re:Indy TCP Server 에서 무한 루프를 동작 함수를 호출하는 경우... 처음과같이 1229 2020/05/13
75839     Re:Indy TCP Server 에서 무한 루프를 동작 함수를 호출하는 경우... 정성훈.해미 1189 2020/04/24
75841         Re:Re:Indy TCP Server 에서 무한 루프를 동작 함수를 호출하는 경우... 김시환 1183 2020/04/24
75845             Re:Re:Re:Indy TCP Server 에서 무한 루프를 동작 함수를 호출하는 경우... 빌더(TWx) 1259 2020/05/08
75846                 Re:Re:Re:Re:Indy TCP Server 에서 무한 루프를 동작 함수를 호출하는 경우... 금목암 1072 2020/05/10
75849                     Re:Re:Re:Re:Re:Indy TCP Server 에서 무한 루프를 동작 함수를 호출하는 경우... 김시환 1121 2020/05/11
75847                     Re:C++20 CoRoutine 테크닉 빌더(TWx) 1443 2020/05/10
75848                         Re:Re:C++20 CoRoutine 테크닉 김시환 1217 2020/05/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.