Здравствуйте! Подскажите, пожалуйста как решить следующую проблему.
У меня есть поток, который просматривает каталог на изменения файлов:
cpp
Код:
__fastcall TMonitorDirL::TMonitorDirL(bool CreateSuspended, String MPath)
: TThread(CreateSuspended)
{
MPath_Thread = MPath;
}
//---------------------------------------------------------------------------
HANDLE dwChangeHandlesL[2];
//---------------------------------------------------------------------------
/*FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME |
FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE |
FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SECURITY*/
void __fastcall TMonitorDirL::Terminate()
{
//TThread::Terminate();
SetEvent(dwChangeHandlesL[1]);
}
//---------------------------------------------------------------------------
void __fastcall TMonitorDirL::Execute()
{
DWORD dwWaitStatus;
int flags = FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME |
FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE;
dwChangeHandlesL[0] = FindFirstChangeNotification(MPath_Thread.t_str(), false, flags);
if (dwChangeHandlesL[0] == INVALID_HANDLE_VALUE) ExitProcess(GetLastError());
dwChangeHandlesL[1] = CreateEvent(NULL, true, false, NULL);
if (dwChangeHandlesL[1] == INVALID_HANDLE_VALUE) ExitProcess(GetLastError());
if ((dwChangeHandlesL[0] == NULL) || (dwChangeHandlesL[1] == NULL)) ExitProcess(GetLastError());
try {
while (true) {
dwWaitStatus = WaitForMultipleObjects(2, (HANDLE *)&dwChangeHandlesL, false, INFINITE);
if (dwWaitStatus == WAIT_OBJECT_0) {
SendMessage(Glav_Form->Handle, WM_HANDLE_THREAD_2, GetCurrentThreadId(), 2);
FindNextChangeNotification(dwChangeHandlesL[0]);
}
else if (dwWaitStatus == WAIT_OBJECT_0 + 1) {
break;
}
else if (dwWaitStatus == WAIT_FAILED) {
Terminate();
}
}
}
__finally {
FindCloseChangeNotification(dwChangeHandlesL[0]);
CloseHandle(dwChangeHandlesL[1]);
}
}
//---------------------------------------------------------------------------
h
Код:
class TMonitorDirL : public TThread
{
private:
String MPath_Thread;
protected:
bool __fastcall TMonitorDirL::MD (String Src);
void __fastcall Execute();
public:
void __fastcall Terminate();
__fastcall TMonitorDirL(bool CreateSuspended, String MPath);
};
Запуск потока работает так:
Вызывается каждый раз, при считывании каталога
Код:
void __fastcall TGlav_Form::OpenLeftMonitorDirFile()
{
if (MonitorDirL_ThreadPro != NULL) {
MonitorDirL_ThreadPro->Terminate();
MonitorDirL_ThreadPro = NULL;
}
String MonitorPath = LCatalogEdit->Text;
String temp_str = MonitorPath;
int length = temp_str.Length();
if (length > 250)
temp_str = String("\\\\?\\") + temp_str;
char buffer[MAX_PATH - 1];
int length_short = GetShortPathName(temp_str.t_str(), buffer,
sizeof(buffer));
String ResultStr;
if (length_short != 0)
ResultStr = (String)buffer;
else
ResultStr = temp_str;
String ProblemMonitorDirL = "";
MonitorDirL_ThreadPro = new TMonitorDirL(true, ResultStr);
MonitorDirL_ThreadPro->FreeOnTerminate = true;
MonitorDirL_ThreadPro->Priority = tpNormal;
MonitorDirL_ThreadPro->Resume();
}
// ---------------------------------------------------------------------------
Так вот на строчках:
Код:
__finally {
FindCloseChangeNotification(dwChangeHandlesL[0]);
CloseHandle(dwChangeHandlesL[1]);
возникает ошибка, если в заданной папке, что-то меняется.
Заранее спасибо.