2012-10-12 3 views
0

온라인 Xbox Live, PSN 및 Steam 친구를 추적하는 응용 프로그램을 개발 중입니다. 응용 프로그램은 QNetworkAccessManager를 사용하여 일련의 QNetworkRequest를 수행합니다. Xbox Live 및 PSN 코드는 QWebView를 사용하여 브라우저 환경을 시뮬레이션합니다. 요청은 올바르게 수행되지만 각 요청이 완료 될 때까지 기본 GUI 스레드가 느려집니다.Qt 4 GUI 응용 프로그램 GUI 스레드가 QNetworkRequests에서 느려짐

void Steam::fetchFriends(QString username) 
{ 
    QNetworkRequest userXml("http://steamcommunity.com/id/" + username + "/friends/?xml=1"); 
    m_nam->get(userXml); 
} 

나는 친구가 다운로드 및 처리 된 GUI를 알려주는 신호를 만들었습니다

는 여기에 몇 가지 예제 코드입니다. 그런 다음 친구 목록이 GUI에서 업데이트됩니다. 일부 다른 코드는 더 복잡하며 처리 코드를 다른 스레드로 옮길 필요가 있습니다.

누군가 QNetworkAccessManager 및 QNetworkRequest가 멀티 스레드인지 또는 별도의 스레드로 이동해야하는지 확인할 수 있습니까?

답변

2

QNetworkAccessManager은 구현시 스레드되지 않습니다. 비동기이며 이벤트 루프를 사용합니다.

성능상의 이유로 스레드를 스레드 상태로 사용해야한다고 주장한 사람은 스레드에서 스레드를 시도하고 이동하지 말고 스레드에서 특별히 인스턴스를 만들어야한다고 지적했습니다. link to someone posting an example of such입니다.

별도의 스레드에서 만들기 전에 먼저 주 스레드가 느려질 수있는 차단 작업을 수행하지 않도록하십시오.

+0

설명해 주셔서 감사합니다. 추가 조사를 통해 내 상태 머신이 내 애플리케이션의 운영자를 차단하는 것으로 보입니다. Xbox Live, PSN 및 Steam에 대한 상태 시스템 설정을 통해 로그인, 작업 처리 및 기타 작업을 모니터링합니다. 문제는 내 상태 시스템의 다음 상태에 도달하려면 현재 상태에서 작업을 완료해야합니다 (오래 걸릴 수도 있음). 내 상태 머신을 새로운 스레드로 옮기고 어떻게 작동하는지 보겠습니다. 상태는 각 페이지로드 및 처리 이벤트 후에 변경됩니다. –

+0

상태 시스템은 문제가 아닙니다. QtWebkit은 차단 작업을 수행합니다. 요청이 QtWebkit의 QWebView 내에서 처리되는 동안 GUI 그리기를 재개하는 방법을 찾지 못했습니다. 좀 더 조사 할게. –