환경 요약 : qt로 작성된 응용 프로그램을 실행하는 장치가 있습니다. 데이터베이스 작업 (SQlite)을 처리하는 메인 스레드와 네트워킹 작업을위한 별도의 스레드 (3G를 통해)가 있습니다. 메인 스레드 이벤트 루프는 QCoreApplication :: exec에 의해 실행되고 네트워킹 작업을 처리하는 다른 스레드는 QThread :: exec에 의해 실행됩니다. Btw, 시작 후 소켓 스레드 선호도가 변경됨 (예 : moveToThread (socketThreadPtr))QTimer는 다른 루프가 커다란 루프로 인해 늦게 작동합니다.
간략한 설명 : 메인 스레드는 루프에서 사용 중이므로 데이터베이스에서 약 10k 레코드를 선택하기 위해 루프에서 약 + 30 초. 네트워크 스레드에는 만료 될 때마다 살아있는 메시지를 보내야하는 15 초 타이머가 있습니다. 문제는 timeout() 신호 슬롯이 루프가 끝난 후에 만 실행된다는 것입니다.
솔루션은 지금까지 설립되었지만 만족스럽지 않습니다. 레코드를 선택하는 루프에서 QCoreApplication :: processEvents를 호출하면 문제가 해결되지만 해결 방법 대신 솔루션이 있는지 궁금합니다.
참고 : 활성 상태 메시지를 보내는 명령을 제공하는 타이머, 신호 및 슬롯은 현재 주 스레드에서 처리되지만 (읽기/쓰기는 네트워크 스레드에서 발생 함) 또한 네트워크 스레드에서 타이머를 이동했지만 기본 스레드에있는 것과 같은 결과를 얻었습니다.
는 네트워크가 네트워크 스레드에 관련되어야한다. 연결된 슬롯이 네트워크 스레드의 오브젝트에도 있는지 확인하십시오. –
타이머는 여전히 주 스레드에 있습니다. 첫 번째 : 소켓에 소켓을 직접 만들거나 socketdescriptor를 설정하고 QueuedConnection을 사용하여 소켓을 엽니 다. 생성자에 타이머를 만들고 객체의 movetothread를 호출하지 말고 invokeMethod 또는 대기중인 신호/슬롯 연결을 사용하여 initialize 함수를 호출하십시오. 이 함수에서 new를 사용하여 타이머를 만듭니다. 그렇지 않으면 타이머가 실제로 메인 스레드에 머무를 것입니다. –
안녕 얘들 아! 빠른 답장을 보내 주셔서 감사합니다. Kevin, 타이머가 네트워크 스레드에서 완전히 이동했습니다. 네트워크 스레드의 해당 슬롯이 있습니다. Btw, 타이머가 힙에 만들어졌습니다. – ionutCb