Mati napisał(a)
Po pierwsze - pokaż kod.
Po drugie - Nie używaj już QHttp
QGetTileWebThread::QGetTileWebThread(QMapWidget *A_pMapWidget, QMapTile *A_pMapTile, int A_iTileX, int A_iTileY, int A_iZoom, QObject *parent) :
QGetTileThread(A_pMapWidget, A_pMapTile, A_iTileX, A_iTileY, A_iZoom, parent),
m_iReqID(0)
{
m_pTileRequests = QMapTileRequests::GetInstance();
m_pHttpStorage = QHttpStorage::GetInstance();
connect(this, SIGNAL(terminated()), SLOT(slotFinished()));
connect(this, SIGNAL(signalLoadImage(QMapWidget *,int,int,int)), this, SLOT(slotGetImageFromNet(QMapWidget*,int,int,int)));
}
void QGetTileWebThread::run()
{
if(m_pMapWidget)
emit signalLoadImage(m_pMapWidget, m_iTileX, m_iTileY, m_iZoom);
}
void QGetTileWebThread::slotGetImageFromNet(QMapWidget *A_pMapWidget, int A_iTileX, int A_iTileY, int A_iZoom)
{
m_pHttp = new QHttp(this);
if(!m_pHttp)
return;
connect(m_pHttp, SIGNAL(requestFinished(int,bool)), this, SLOT(slotRequestHttpFinished(int, bool)));
connect(m_pHttp, SIGNAL(done(bool)), this, SLOT(slotDone(bool)));
connect(m_pHttp, SIGNAL(stateChanged(int)), this, SLOT(slotStateChanged(int)));
QString strTile = QString("/%1/%2/%3").arg(A_iZoom).arg(A_iTileX).arg(A_iTileY);
QString strURL = QString("http://%1%2/%3.png").arg(strServer).arg(MAP_HOST).arg(strTile);
QTileStorage *pTileStorage = QTileStorage::GetInstance();
m_http.setHost(strServer + MAP_HOST);
QHttpRequestHeader header("GET", strURL);
header.setValue("User-Agent", "Mozilla");
m_iReqID = m_pHttp->request(header);
if(m_pTileRequests && pTileStorage)
m_pTileRequests->InsertIntoMap(m_iReqID, pTileStorage->CreateCasheKey(A_iTileX, A_iTileY, A_iZoom));
if(m_pHttpStorage)
m_pHttpStorage->InsertIntoMap(m_iReqID, m_pHttp);
}
void QGetTileWebThread::slotRequestHttpFinished(int A_iRequest, bool A_bError)
{
bool bContinue = true;
QPixmap pixmap;
QByteArray byarData;
QTileStorage *pTileStorage = QTileStorage::GetInstance();
QMapSettings *pMapSettings = QMapSettings::GetInstance();
if(!A_bError && m_pHttp && m_pHttp->bytesAvailable() > 0)
{
byarData = m_pHttp->readAll();
bContinue = pixmap.loadFromData(byarData);
if(bContinue)
bContinue = pTileStorage->InsertTileTntoStorage(m_iTileX, m_iTileY, m_iZoom, pixmap);
else
pTileStorage->InsertIntoErrorTile(m_iTileX, m_iTileY, m_iZoom);
m_pTileRequests->RemoveFromMap(m_iReqID);
if(m_pMapWidget && m_pMapTile)
m_pMapWidget->update(m_pMapTile->x(), m_pMapTile->y(), pMapSettings->GetTileSize(), pMapSettings->GetTileSize());
if(m_pHttpStorage)
m_pHttpStorage->RemoveFromMap(m_iReqID);
}
if(m_pTileRequests->AllRequestsCompleed() && m_pHttpStorage)
m_pHttpStorage->RelaseHttp();
}
void QGetTileWebThread::slotFinished()
{
// if(m_pHttp.currentId() == m_iReqID)
// {
// m_pHttp.abort();
// m_pHttp.closeConnection();
// m_pHttp.close();
// m_pTileRequests->RemoveFromMap(m_iReqID);
// }
}
void QGetTileWebThread::slotDone(bool A_bError)
{
// m_pHttp.abort();
// m_pHttp.closeConnection();
// m_pHttp.close();
// m_pHttp.clearPendingRequests();
}
void QGetTileWebThread::slotStateChanged(int A_iState)
{
if(A_iState == QHttp::Unconnected)
m_pHttpStorage->RemoveFromMap(m_iReqID);
}
może trochę kombinowania jest - ale coś tam próbuję rozkminić
2 - czemu?
zresztą znalazłem inny sposób na pobieranie z sieci czegoś oparty na QNetworkAccessManager
i problem był ten sam
3 - co więcej nie wiem czemu ale przy metodzie request mam identyfikatory parzyste, a gdy odbieram żądanie (reakcja na sygnał requestFinished) mam identyfikatory nieparzyste
no i nie wiem skąd i czemu to tak - ogólnie działa dobrze, póki sięnie zapcha - jak sobie puszczę czasami netstat to mam tego dużo na liście
próbowałem zrobić w osobnej klasie mapę do przechowywania wskaźników do QHttp na zasadzie
id żądania - wskaźnik do QHttp, ale jako, że w mapie mam same idiki parzyste, a przy requestFinished przychodzą mi idiki nieparzyste to sam nie wiem co robić i jak to zrobić, aby było dobrze, tj po skończonym żądaniu HTTP port (połączenie) nie wisiał(o)