시작시 주 스레드에서 두 개의 스레드를 시작하는 Qt 응용 프로그램이 있습니다. 이 두 스레드는 모두 QNetworkAccessManager 오브젝트의 고유 한 인스턴스를 사용하여 네트워크 요청을 작성합니다. 내 프로그램은 시간의 약 50 %를 계속 충돌하고 어떤 스레드가 충돌하는지 모르겠습니다.2 스레드에서 2 네트워크 요청을 만들 때 Qt 응용 프로그램이 작동을 멈 춥니 다.
두 스레드간에 직접 데이터 공유 또는 신호가 발생하지 않습니다. 특정 이벤트가 발생하면 스레드가 주 스레드에 신호를 보냅니다. 그러면 주 스레드가 두 번째 스레드에 신호를 보냅니다. 그러나 로그를 인쇄하면 신호가 발생하는 동안 충돌이 발생하지 않는다는 것이 확실합니다.
두 스레드의 구조는 다음과 같습니다. URL을 제외하고는 스레드의 차이는 거의 없습니다 등
MyThread() : QThread() {
moveToThread(this);
}
MyThread()::~MyThread() {
delete m_manager;
delete m_request;
}
MyThread::run() {
m_manager = new QNetworkAccessManager();
m_request = new QNetworkRequest(QUrl("..."));
makeRequest();
exec();
}
MyThread::makeRequest() {
m_reply = m_manager->get(*m_request);
connect(m_reply, SIGNAL(finished()), this, SLOT(processReply()));
// my log line
}
MyThread::processReply() {
if (!m_reply->error()) {
QString data = QString(m_reply->readAll());
emit signalToMainThread(data);
}
m_reply->deleteLater();
exit(0);
}
이제 이상한 것은 내가 스레드 중 하나를 시작하지 않는 경우, 프로그램이 잘 실행, 또는 적어도에 충돌하지 않는있다 약 20 건의 호출. 두 스레드가 차례로 실행되면 프로그램이 중단되지 않습니다. 두 스레드를 동시에 시작하고 실행하는 경우 프로그램은 시간의 반에 대해서만과 충돌합니다.
로그에서 수집 한 또 다른 흥미로운 점은 프로그램이 중단 될 때마다 my log line
이라는 줄이 두 스레드에서 마지막으로 실행된다는 것입니다. 그래서 어떤 쓰레드가 충돌을 일으키는 지 모르겠습니다. 그러나 QNetworkAccessManager가 어떻게 든 비난받을 것으로 의심됩니다.
나는 충돌을 일으키는 것에 대해 꽤 공백이다. 나는 어떤 제안이나 조언을 주셔서 감사합니다. 미리 감사드립니다.
나는 애플리케이션 개발에 상당히 늦은 2 개의 게시물 (잘못된 길과 올바른 길)을 발견했다. 내 자바 배경도 도움이되지 않았다. 스레딩을하기 위해 일반적으로 스레드를 확장한다. 이 문제는 스레딩이 아닌 네트워크 액세스 관리자 자체에서 발생하는 것으로 보입니다. 문제를 재현하는 베어 본 코드 스 니펫으로 주어진 접근 방식을 시도해 보겠습니다. 내가 누락 된 QNetworkAccessManager의 뉘앙스에 대한 의견을 보내주십시오. 감사. – Sameer
내 편집 된 답변보기 –
그리고 다른 편집 –