Re[7]: Asynchronous Pluggable Protocol http-заголовки, post и put данные
От: east  
Дата: 20.04.15 08:57
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>Сообщить, что есть файл вызовом ProtocolSink.ReportProgress(BINDSTATUS_CACHEFILENAMEAVAILABLE), и при поступлении данных писать их в этот файл. При этом если Read вызывается, то и отдавать полученные данные.


A>Я делаю следующие вызовы:


A>ProtocolSink.ReportProgress(BINDSTATUS_FINDINGRESOURCE, PWideChar(Url));

A>ProtocolSink.ReportProgress(BINDSTATUS_CONNECTING, PWideChar(Url));
A>ProtocolSink.ReportProgress(BINDSTATUS_SENDINGREQUEST, PWideChar(Url));
A>ProtocolSink.ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, PWideChar(Response.MIMEType));
A>ProtocolSink.ReportProgress(BINDSTATUS_CACHEFILENAMEAVAILABLE, PWideChar(Stream.FileName));
A>ProtocolSink.ReportData(BSCF_FIRSTDATANOTIFICATION, 0, 0);
A>ProtocolSink.ReportData(BSCF_INTERMEDIATEDATANOTIFICATION, Saved, Size); // Много раз
A>ProtocolSink.ReportData(BSCF_LASTDATANOTIFICATION or BSCF_DATAFULLYAVAILABLE, Saved, Size);
A>ProtocolSink.ReportResult(S_OK, Response.Status, nil);

A>Все это происходит из отдельного потока.


В общем вот это я вынес отдельный поток
static UINT LoadSrc(LPVOID pParam)
{
    THREAD* pLoad = (THREAD*)pParam;
    pLoad->pSink->ReportProgress(BINDSTATUS_CONNECTING, pLoad->sUrl);
    pLoad->pSink->ReportProgress(BINDSTATUS_SENDINGREQUEST, pLoad->sUrl);
    pLoad->pSink->ReportProgress(BINDSTATUS_BEGINDOWNLOADDATA, pLoad->sUrl);
    pLoad->BD->Send(pLoad->sUrl);
    CString ct = pLoad->BD->GetRawHeader(_T("Content-Type:"));
    pLoad->pSink->ReportProgress(BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE, ct);
    pLoad->pSink->ReportData(BSCF_DATAFULLYAVAILABLE, 0, pLoad->BD->m_ulDataLen);
    pLoad->pSink->ReportResult(S_OK,0,NULL);
    return 0;
}


Как и следовало ожидать, ничего не изменилось. Все равно браузер два раза вызывает метод Start в разных потоках. Наблюдается такая ситуация, если в Start просто вернуть S_OK, то браузер виснет. Если вызвать ReportData или ReportResult, то Start вызывается второй раз в другом потоке и следовательно вызываются все остальные методы и как следствие страница не найдена и ошибки.
Может у кого есть рабочий код асинхронного протокола?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.