다음 포스트에 따르면 현재 실행중인 슬롯이 완료되면 방출 된 신호가 제공됩니다.
Wait for a SLOT to finish the execution with Qtsocket :: readyRead()에 대한 새로운 신호가 실행되는 이유는 이전 슬롯이 아직 처리 중인데도 마찬가지입니다.
단일 스레드 인 ssl 소켓을 기반으로하는 클라이언트 - 서버 통신 응용 프로그램이 있습니다.
connect(socket, &QSslSocket::readyRead, [&]() { myObject.Read(); });
클라이언트 & 서버가 서로에게 약간의 사용자 정의 메시지를 보낼 수 있습니다. 메시지가 보내거나받을 때마다 ACK
바이트 (00)를 보냅니다.
대부분의 경우, 나는 Read()
이 실행 중간에있을 때 다음 readyRead()
이 제공됩니다. 시작 부분에 & 끝의 디버그 문을 넣으십시오. myObject->Read()
. 그들은 디버그 시작이 다시 &으로 다시 호출됨을 확인합니다. 중단 점에서도 마찬가지입니다.
너무 많은 양의 데이터가 수신되면 재귀 적 스택 프레임이 너무 많아 Read()
초입니다. 앱 GUI가 느려지거나 충돌이 발생합니다.
일반적으로이 재귀는 클라이언트가 myObject->Read()
의 일부로 ACK를 보내려고 할 때 발생합니다. 그 시간에 readyRead()
이 부수적으로 신호를 받으면 &도 수신됩니다. 그러나 이전 신호의 슬롯은 여전히 처리 중입니다.
질문 :
- 는 Qt는 프레임 워크 슬롯은 여전히 중도 (단일 스레드) 때 사이에 신호를 수용 할 수 있습니까?
- 이 소켓 특정 시나리오를 수정하는 방법은 무엇입니까?
주 :
- 단일 스레드 기본적으로는의 Qt::ConnectionType
이 DirectConnection
입니다. 나는 QueuedConnection
으로 시도했지만 그 결과는 같습니다.
- myObject.Read()
은 매우 복잡하며 다른 많은 함수 호출이 있습니다. 이것이 문제의 원인이된다면 무엇을 찾아야할지 알려주세요. 실제 코드를 작성하는 것은 비현실적입니다.
도움이 될 수도 있습니다 https://stackoverflow.com/questions/11230080/qobject-based-class-has-a-queued-connection-to-itself –
당신이있는 동안'myObject-> Read()'가 호출되면 이미 이벤트 루프를 제어하고있는 시점이 있습니다. 함수의 코드를 추가 할 수 있습니까? –
@BenjaminT,'Read()'메쏘드 안에는 핵심 기능인 Qt와 관련이없는 것들이 많이 있습니다. 내부에 여러 가지 방법이 있으므로 코드를 작성하는 것은 비현실적입니다. 그러나 슬롯이 아직 실행 중일 때 이벤트 루프가 제어 할 수있는 방법은 무엇입니까? 이것이 어떤 방법으로 가능한지 제안 할 수 있습니까? 나는 그것들을 볼 수 있을지도 모른다. – iammilind