bool CVulEngine::CancelScanVul()
{
	if(!m_hThreadVulScan)
		return false;
	_SafeTerminateThread( m_hThreadVulScan );
	return true;
}
bool CVulEngine::CancelScanIgnored()
{
	if(!m_hThreadVulIgnored)
		return false;
	m_bVulIgnoredCanceled = TRUE;
	m_pVulScanIgnored->Cancel();
	_SafeTerminateThread( m_hThreadVulIgnored, FALSE );
	return true;
}
bool CVulEngine::ScanIgnored( HWND hWnd )
{
	if(m_hThreadVulIgnored)
		_SafeTerminateThread( m_hThreadVulIgnored, FALSE );
	
	m_bVulIgnoredCanceled = FALSE;
	m_hThreadVulIgnored = (HANDLE) CreateThread(NULL, 0, ThreadFunc_ScanIngored, (void*)hWnd, 0, NULL);
	return m_hThreadVulIgnored!=NULL;
}
bool CVulEngine::ScanSuperseded(HWND hWnd)
{
	if(m_hThreadSuperseded)
		_SafeTerminateThread( m_hThreadSuperseded, FALSE );

	m_bVulScanSuperseded = FALSE;
	m_hThreadSuperseded = CreateThread(NULL, 0, ThreadFunc_ScanSuperseded, (void*)hWnd, 0, NULL);
	return m_hThreadSuperseded!=NULL;
}
bool CVulEngine::ScanVul(HWND hWnd)
{
	if(m_hThreadVulScan)
		_SafeTerminateThread( m_hThreadVulScan, FALSE );

	m_bVulScanCanceled = FALSE;
	m_hThreadVulScan = CreateThread(NULL, 0, ThreadFunc_Scan, (void*)hWnd, 0, NULL);
	return m_hThreadVulScan!=NULL;
}
bool CVulEngine::ScanFixed(HWND hWnd)
{
	m_bVulFixedCanceled = FALSE;
	if(m_hThreadVulFixed!=NULL)
	{
		_SafeTerminateThread( m_hThreadVulFixed );
	}
	m_hThreadVulFixed = (HANDLE) CreateThread(NULL, 0, ThreadFunc_ScanFixed, (void*)hWnd, 0, NULL);
	return m_hThreadVulFixed!=NULL;
}
bool CVulEngine::ScanVul(HWND hWnd)
{
	if(m_hThreadVulScan!=NULL)
	{
		_SafeTerminateThread( m_hThreadVulScan );
	}
	//m_hThreadVulScan = (HANDLE) _beginthreadex(NULL, 0, ThreadFunc_Scan, (void*)hWnd, 0, NULL);
	m_hThreadVulScan = CreateThread(NULL, 0, ThreadFunc_Scan, (void*)hWnd, 0, NULL);
	return m_hThreadVulScan!=NULL;
}
void CVulEngine::CancelScanFixed()
{
	if(!m_hThreadVulFixed)
		return;

	m_bVulFixedCanceled = TRUE;
	m_pIVulFixedSoft->Cancel();
	m_pIVulFixed->Cancel();
	_SafeTerminateThread( m_hThreadVulFixed, FALSE );
}
bool CVulEngine::CancelScanVul()
{
	if(!m_hThreadVulScan)
		return false;
	
	m_bVulScanCanceled = TRUE;
	m_pVulScan->Cancel();
	_SafeTerminateThread( m_hThreadVulScan, FALSE );
	return true;
}
bool CVulEngine::CancelRepair()
{
	if(!m_hThreadVulRepair)
		return false;
	
	m_bRepairCanceled = TRUE;
	m_pRepairVul->StopRepair();
	_SafeTerminateThread( m_hThreadVulRepair );
	//_RelayMessage( NULL, WMH_REPAIR_DONE, 1, 0);
	return true;
}
bool CVulEngine::RepairAll( HWND hWnd, const CSimpleArray<int> &arrVulIds, const CSimpleArray<int> &arrSoftVulIds )
{
	m_bRepairCanceled = FALSE;
	if(m_hThreadVulRepair!=NULL)
		_SafeTerminateThread( m_hThreadVulRepair );
	
	if(arrVulIds.GetSize()==0 && arrSoftVulIds.GetSize()==0)
	{
		return false;
	}
	
	m_arrRepairVulIds.RemoveAll();
	m_arrRepairVulSoftIds.RemoveAll();
	CopySimpleArray(arrVulIds, m_arrRepairVulIds);
	CopySimpleArray(arrSoftVulIds, m_arrRepairVulSoftIds);
	m_hThreadVulRepair = (HANDLE) CreateThread(NULL, 0, ThreadFunc_Repair, (void*)hWnd, 0, NULL);
	return true;
}
void CVulEngine::WaitScanDone()
{
	if(!m_hThreadVulScan)
		return;
	_SafeTerminateThread( m_hThreadVulScan );
}