Имеется небольшое приложение на WTL, используется boost::thread. При выборе директории через стандартный диалог считывается информация о файлах внутри и выводиться в список, это сделано в отдельном потоке для того, что бы был доступен GUI. Предположим мне нужно выбрать другу директорию и считывать информацию о ее файлах этим же потоком, но ведь он уже выполняется. Как мне его прервать и запустить снова с параметрами другой директории?
Итак для большей наглядности приведу несколько ф-ций:
По нажатию на кнопочку "FILL" вызываеться диалог "Browse for folder"
LRESULT CMainDlg::OnFill(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	{
		TCHAR szPath[MAX_PATH];
		BOOL res = FALSE;
		LPMALLOC pMalloc;
		if (::SHGetMalloc(&pMalloc) == NOERROR) 
		{
			BROWSEINFO bi;
			::ZeroMemory(&bi,sizeof bi);
			bi.ulFlags = BIF_RETURNONLYFSDIRS;
			LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi);
			if (pidl != NULL) 
			{
				if (::SHGetPathFromIDList(pidl,szPath))
				{
					if (szPath) //если нажата кнопка ОК
					{
						TheThread (szPath); //вызывается отдельный поток
						
					}
				}
			}
		}
			return 0;
	}
}
вот что делает этот самый поток
int CMainDlg::TheThread (const CString& pth)
{
	boost::thread my_thread(boost::bind(&CMainDlg::ReadFilesInf, this, pth)); //вызывается метод ReadFilesInf с параметром szPath
	return 0;
}
вот сам метод ReadFilesInf
int CMainDlg::ReadFilesInf (const CString& pth)
{
	int userReplay;
	path p (pth.GetString());
	
	/* привожу для наглядности 
	struct FileInformation 
		{
			CString fName;
			CString fPath;
			CString size;
			CString time;
		};*/
	
		FileInformation information;
		
		EnterCriticalSection(&cs);
		
		recursive_directory_iterator end;
		recursive_directory_iterator it(p);
		while (it != end)
		{
			try
			{
				path curPath(*it);
				if (is_regular_file(curPath))
					{
						CTime w_time = last_write_time(*it);
						CString str = w_time.Format( L"%d, %b, %Y, %H:%M" );
						LPCTSTR timeCreation = str;
						std::wstring fileSizeStr = boost::lexical_cast<std::wstring>(file_size(curPath));
						std::wstring filePathStr = boost::lexical_cast<std::wstring>(curPath);
						
						
						information.fName = curPath.leaf().c_str();
						information.fPath = curPath.branch_path().c_str();
						information.size = fileSizeStr.c_str();
						information.time = timeCreation;
						list_.fileList_.push_back (information); //list_ это мой виртуальный список   fileList_ это вектор который хранит информацию о файлах
						list_.SetItemCountEx(list_.fileList_.size(), LVSICF_NOINVALIDATEALL);
					}
				++it;
			}
			catch (boost::system::system_error const& e)
			{
				if (e.code().value() != ERROR_ACCESS_DENIED)
				{
					throw;
				}
				
			}
		}
		LeaveCriticalSection(&cs);
		
	return 0;
}
П.С. Господа приношу извинения если не достаточно доступно изложил суть вопроса.