QTcpsSocket 블러킹모드 로 제작했을때, waitForReadyRead 에서 지연현상 ...
QThread 내부 run() 함수내부에 아래와 같이 read 하는 부분이 블러킹 모드로 잘 돌아가고 있습니다.
문제는.... 엄청 느리다는게 문제입니다.
waitForReadyRead 이 함수에서 상당시간 기다림을 하고 있는 것 같은데..
winsock 을 사용할때는 break point 를 거는 것 조차 미안할 정도로 빠르게 돌거든요..
음... 어찌하면 QTCPSocket 의 블러킹 모드를 빠르게 구현할 수 있을런지요?
한번더 도움을 청합니다. ㅠㅠ 쥘쥘
bool stream::ReadBuf(char* pBuf,int len)
{
if (m_socket.state() == QAbstractSocket::ConnectedState)
{
bool bReady = m_socket.waitForReadyRead(3000) ;
if (bReady) {
qint64 ret = 0, get = 0;
while(get < len)
{
ret = m_socket.read( (char*)pBuf + get ,len - get ) ;
if(ret < 0)
{
return false;
}
else if (ret == 0) {
break ;
}
get += ret;
}
return get;
}
else {
return true ;
}
}
}
상당시간 기다린다는게, 읽어올 데이터가 없어서 3초
상당시간 기다린다는게, 읽어올 데이터가 없어서 3초 기다리는걸 말씀하시는건가요?
3초 기다리는게 오래 걸리는 걸로 느껴지신다면 더 짧은 시간 기다리게 하시면 되지요.
아니면, 100%확실하게 읽어올 준비가 됬을텐데도 불구하고 3초 기다리고 있는 문제가 있다는 뜻인가요?
음..
해당 포트로 들어오는 데이터는 계속 쌓여있는 상태입니다. 서버쪽에서는 계속 WRITE 를 하고있죠.
분명 WINSOCK 을 이용해 CLIENT 쪽에서 RECV 하게되면 BLOCKING MODE 라 할지라도 WAITING 시간없이 THREAD 내에서 계속해서 READ 가 잘되었습니다.
3초를 기다리는것은, TERMINATE TIME 인데요, DEFAULT 값으로 들어가 있구요, 그것보다 짧게 했을땐, 데이터를 READ 할 수가 없습니다.
QTcpSocket 에서 읽어올 준비라는 SIGNAL 을 발생시킨다는 것 자체가 쫌 이상하다는 생각이 듭니다.
해당 포트로 연결되어있는 스트림에 data 가 항상 들어오는데, ready 신호가 발생해야만 read 할 수 있다는것도 잘 이해가 안되구요..
QTcpSocket 에 대해 잘 아시는 분 있으시면 도움을 구합니다.
우선 시그널 잡아서 작동하는걸 디폴트로 해둔 것은,
우선 시그널 잡아서 작동하는걸 디폴트로 해둔 것은, Qt가 GUI라이브러리를 포함하기 때문입니다.
GUI의 메인루프에서 블럭하면서 작동하게 되면 인터페이스가 얼어버리니까, 비동기방식이 기본작동방식이고,
적으신 함수를 이용하여 동기방식으로 작동하게 할수도 있게 만든 것입니다.
TERMINATE TIME으로 DEFAULT로 들어간다는게 무슨 뜻인지 모르겠네요.
3초라는 제한이 Qt와는 상관없는 값이라는 뜻으로 알겠습니다.
3초보다 짧게 했을 때 데이터를 못 읽어온다는 것은, waitForReadReady함수가 false를 리턴한다는 뜻인가요?
저도 이전에 간단한 파일서버를 QTcpSocket으로 만들어본적이 있는데 그러한 문제는 겪은 적이 없습니다.
전 아무래도 다른쪽에 문제가 있다는 생각이 드네요.
댓글 달기