ну вот такой поток......(смотри ниже)
когда коннект нормальный поток умирает правильна
но если я ухожу по catch ( CInternetException* pEx )
то тут и вижу полный бред ..... я вываливаюсь
но поток не закрывается (( и соответственно этот зомби
блокирует все что может ........(((
короче мож кто нидь подскажет где я тут лопухнулся???
void Mystep(void *ch)
{
int cntstr;
char before[100];
CString strServerName; // имя сервера
CString strObject; // имя объекта
INTERNET_PORT nPort; // номер порта для связи
DWORD dwServiceType; // тип сервиса
CFile file2;
CFile file3;
CFileException e;
char prbuf[10];
char *curptr;
char debugstr[40];
char *mytempbuf;
char sysstr[50];
int i,j,l;
int ex,mycritfl=0;
flaghttp=1;
int cnt=0;
mytempbuf=new char[500];
for(;flagwait!=0;)
Sleep(5);
if(strlen((char *)my_url)>3)
m_url=CString((char *)my_url); m_path=CString((char *)my_path);
CInternetSession session( _T( "Delimiter" ), PRE_CONFIG_INTERNET_ACCESS );
// создаём переменную pServer класса CHttpConnection
CHttpConnection* pServer = NULL;
// создаём переменную pFile класса CHttpFile
CHttpFile* pFile = NULL;
try
{
if ( AfxParseURL( m_url, dwServiceType, strServerName, strObject, nPort ) == 0 )
{
::PostMessage(mhWnd,STOP_HTTP,0,0);
delete[] mytempbuf;
_endthread();
}
m_mes = "";
m_mes += "Server Name = ";
m_mes += (CString)strServerName; m_mes += "\r\n";
m_mes += "Object Name = ";
m_mes += (CString)strObject; m_mes += "\r\n";
m_mes += "Port = ";
itoa( nPort, temp, 10 );
m_mes += (CString)&temp[0]; m_mes += "\r\n";
::PostMessage(mhWnd,DATE_UPDATE,0,0);
// Устанавливаем подключение по HTTP протоклолу.
pServer = session.GetHttpConnection( strServerName, nPort );
// посылаем запрос об объекте ( strObject )
pFile = pServer->OpenRequest(
CHttpConnection::HTTP_VERB_GET, strObject, NULL, 1, NULL, NULL,
INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECT | INTERNET_FLAG_DONT_CACHE
);
// Добавляем заголовок к HTTP запросу
pFile->AddRequestHeaders( _T( "Accept: */*\r\nUser-Agent: Delimiter\r\n" ) );
// посылаем запрос
pFile->SendRequest( );
DWORD dwRet; // переменная для хранения кода состояния
pFile->QueryInfoStatusCode( dwRet ); // записываем код состояния в dwRet
// вывод данных
m_mes += "The HTTP GET returned a status code of ";
itoa( dwRet, temp, 10 );
m_mes += (CString)&temp[0]; m_mes += "\r\n";
CString strHeader; // переменная для хранения полученного заголовока запроса
pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strHeader); // записываем заголовок в strHeader
// вывод данных
m_mes += "Header = ";
m_mes += strHeader;
::PostMessage(mhWnd,DATE_UPDATE,0,0);
// если код состояния не равен 200, то выходим из функции
if( dwRet != 200 )
{ m_mes += "thread terminate!";
::PostMessage(mhWnd,STOP_HTTP,0,0);
delete[] mytempbuf;
session.Close( );
_endthread();
}
// ----------------------------------------------------------
// проверка выбора файла для записи
m_mes += "Starting download the file."; m_mes += "\r\n";
if( m_path == "" )
{
m_mes += "Error! No file to save. Choese the file.";
m_mes += "\r\n";
//UpdateData( FALSE );
session.Close( );
::PostMessage(mhWnd,STOP_HTTP,0,0);
delete[] mytempbuf;
_endthread();
}
else
{
m_mes += "File name to save : ";
m_mes += m_path; m_mes += "\r\n";
::PostMessage(mhWnd,DATE_UPDATE,0,0);
}
file2.Open((LPCTSTR)m_path,
CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
int allRead = 0;
int nRead = pFile->Read( strBody, 1024 );
allRead += nRead;
m_mes += "Loading ";
itoa( nRead, temp, 10 );
m_mes += (CString)&temp[0]; m_mes += " bytes"; m_mes += "\r\n";
::PostMessage(mhWnd,DATE_UPDATE,0,0);
file2.Write( strBody, nRead );
while ( nRead > 0 )
{
nRead = pFile->Read( strBody, 1024 );
if( nRead != 0 )
{
m_mes += "Loading ";
itoa( nRead, temp, 10 );
m_mes += (CString)&temp[0]; m_mes += " bytes"; m_mes += "\r\n";
file2.Write( strBody, nRead );
allRead += nRead;
::PostMessage(mhWnd,DATE_UPDATE,0,0);
}
}
m_mes += "\r\n";
m_mes += "Total bytes = ";
itoa( allRead, temp, 10 );
m_mes += &temp[0]; m_mes += "\r\n";
::PostMessage(mhWnd,DATE_UPDATE,0,0);
file2.Close();
pFile->Close(); // закрываем Internet файл
pServer->Close(); // закрываем сервер
m_mes += "Download is complete !!!"; m_mes += "\r\n";
::PostMessage(mhWnd,DATE_UPDATE,0,0);
}
catch ( CInternetException* pEx )
{
char szErr[1024];
pEx->GetErrorMessage( szErr, 1024 );
strcpy((char *)status,"Error: ( ");
m_mes += "Error: ( ";
itoa( int(pEx->m_dwError), temp ,10 );
strcat((char *)status,temp);
m_mes += (CString)&temp[0];
m_mes += " ) ";
strcat((char *)status," ) ");
m_mes += (CString)&szErr[0]; m_mes += "\r\n";
strcat((char *)status,&szErr[0]);
::PostMessage(mhWnd,DATE_UPDATE,0,0);
pEx->Delete( ); // удаление переменной класса CInternetException
if ( pFile != NULL )
delete pFile; // закрываем Internet файл
if ( pServer != NULL )
delete pServer; // закрываем сервер
session.Close( ); // закрываем сессию
flaghttp=0;
delete[] mytempbuf;
::PostMessage(mhWnd,STOP_HTTP,0,0);
_endthread();
}
if ( pFile != NULL )
delete pFile; // закрываем Internet файл
if ( pServer != NULL )
delete pServer; // закрываем сервер
session.Close( ); // закрываем сессию
//####################################
// вырезана обработка
// .......................
//####################################
::PostMessage(mhWnd,STOP_HTTP,0,0);
remove((LPCTSTR)m_path);
delete[] mytempbuf;
flaghttp=0;
_endthread();
}
---
|