|
다시 말씀드리지만, 통신이 한꺼번에 몰려서 UI가 멈추는 현상에 대해서 근본적인 해결책은 서브 쓰레드를 만드는 겁니다.
하지만 중간중간에 코드를 집어넣을 여지가 있다면... Application->ProcessMessages(); 호출을 넣어주면 UI가 동작할
겁니다. 현재 코드 중에서 동작을 하다가 Application->ProcessMessages()를 호출하면 메시지 큐에 쌓인 다른 메시지
들을 처리하게 됩니다. 이런 쌓인 메시지들중에서 UI 메시지가 있으면 함께 처리가 되는거죠.
예를 들어 for 문 중간에 한 루프를 돌 때마다 Application->ProcessMessages() 를 호출해주면 됩니다.
하지만 말슴드렸다시피 이건 시간이 많이 걸리는 작업중에 코드를 넣을 여지가 있을 경우에만 가능합니다.
더이상 쪼개지지 않는 단위 코드 자체가 시간을 많이 잡아먹는다면 그 중간에 코드를 넣을 수가 없겠지요.
예를 들어 데이터를 10메가쯤 통째로 받는 코드가 있고 그게 더 이상 코드를 넣을 여지가 없다면 써먹을 수가 없습니다.
이런 경우에도 방법이 아주 없는 건 아닌데.. 예를 들어 TWinSocketStream을 썼다면, 이 클래스를 상속받아서 일정
데이터를 받을 때마다 새로 만든 이벤트를 발생시켜주면 되지요.
그럼...
차요한 님이 쓰신 글 :
: 네 제가 설명이 부족했네요 ^^;
: 단일 스레드가 맞구요 사실 이 상황에서는 서브 스레드가 필요한게
: 정석인데 소스 수정을 덜하기 위해서 바보 같은 질문이지만 별
: 꽁수를 다 생각하게 하네요 ^^
:
: 다시 상황 설명을 해보면요
: 평소에는 여유있게 동작합니다. 2~3분에 한번 꼴로 서버로 부터
: 데이터가 내려 옵니다. 당연히 이 경우에는 그다지 문제가 되지 않습니다만
: 통신 장애라던지 어떤 문제로 인해 일정시간 서버로 부터 데이터를
: 받지 못하게 되면 서버는 여러건의 데이터를 쌓아두고 있다가 다시 통신이
: 재개되면 그 동안에 데이터를 전송하게 됩니다. 그렇게 되면
: 클라이언트는 서버로부터 데이터를 다 받게 되기 전까지 UI는 거의 먹통이
: 되버립니다.
: 프로토콜상 클라이언트는 서버로부터 한건의 데이터를 받으면 OK 메세지를
: 보내게 되는데요 서버로부터 데이터를 받고나서 바로 OK 메세지를 보내지 않고
: 서버와 통신하는 한 사이클의 동작 동안 UI를 받아들일 수 있게 하는 방법이
: 없을까 하고 질문드려 봅니다.
|