информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[C++] thread умирает с переменным успехом 16.06.02 18:47  
Автор: Delimiter Статус: Незарегистрированный пользователь
<"чистая" ссылка>
ну вот такой поток......(смотри ниже)

когда коннект нормальный поток умирает правильна
но если я ухожу по 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();

}

---
[C++] thread умирает с переменным успехом 17.06.02 00:54  
Автор: Duxx Статус: Незарегистрированный пользователь
<"чистая" ссылка>
у меня такая же ситуация с потоком возникала если я незакрою сокет, в этом случая зомби оставился висеть, такими обьектами MFC какими пользуешся ты я непользовался поэтому точно сказать немогу сказать в чем проблема.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach