Имеется небольшое приложение на 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;
}
П.С. Господа приношу извинения если не достаточно доступно изложил суть вопроса.