Отладка приложений



              

Требования к TraceSrv - часть 6


}

// Теперь, когда указатель проверен, получить длину 

// входной строки (в символах).

 iInputLen = IstrlenW ( bstrText ) ;

// Вычислить максимальное число байт, необходимых для

 // входной строки. 

UINT uiSize = ( ilnputLen * sizeof ( OLECHAR ) ) +

k_SIZE_FULLFORMATBYTES ;

// Захватить объект lock, чтобы защитить класс m_cOutput.

 // Grab the lock to protect the m_cOutput class.

 ObjectLock lock ( this ) ;

 // Если это первое обращение к ProcessTrace (m_lBuffSize - 0), 

//то этот if-блок служит исходной точкой распределения памяти,

 if ( uiSize >= m_cOutput.BufferSize ( ) ) 

{

// Удалить существующий буфер и распределить больший.

 m_cOutput.Free ( ) ;

// Распределить буфер, вдвое превышающий размер входной строки

. // Это делается для того, чтобы выполнять распределение памяти

 //не так часто. Это компромисс между неиспользуемой

 // дополнительной памятью и временем на непрерывные распределения.

 // Умножение размера буфера на 2 гарантирует также, что

 //сохраняется четный размер памяти. Программа работает

 // с символами Unicode, поэтому следует избегать нечетных // распределений памяти. 

UINT uiAllocSize = uiSize * 2 ;

// Убедитесь, что получен минимальный размер буфера. 

// Минимальный размер буфера 2 Кбайт, так что в большинстве 

// случаев код в этом if-блоке выполняется только однажды.

if ( k_MIN_TRACE_BUFF_SIZE > uiAllocSize ) 

{

uiAllocSize = k_MIN_TRACE_BUFF_SIZE ;

 }

OLECHAR * pTemp = m_cOutput.Allocate ( uiAllocSize ) ;

 ASSERT ( NULL != pTemp ) ;

 if ( NULL == pTemp ) 

{

return ( Error ( IDSJXJTOFMEMORY ,

 GUID_NULL , EJDUTOFMEMORY ) ) ;

 }

}

// Все проверено, теперь можно начать реальную работу.

 // Увеличить на 1 итоговый счетчик.

 m_dwCurrCount++ ; 

if ( 100000 == m_dwCurrCount )

 {

m_dwCurrCount = 0 ;

 }

// Установить указатель маркера в начало буфера вьвода 




Содержание  Назад  Вперед