Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2013, 17:07   #1
Makin_tosh
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 24
По умолчанию Как лечить External exception C0000008?

Здравствуйте! Подскажите, пожалуйста как решить следующую проблему.
У меня есть поток, который просматривает каталог на изменения файлов:
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]);
возникает ошибка, если в заданной папке, что-то меняется.
Заранее спасибо.
Makin_tosh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi XE3 + SQLite + Data Explorer - External Exception Xardas БД в Delphi 2 02.10.2014 00:14
External exception EEEFACE. WTF? O_o BingoBongo Общие вопросы Delphi 21 10.01.2014 01:35
External Exception C0000006 VadEr Общие вопросы Delphi 3 20.12.2011 21:20
"External exception EEFFACE." - Что это? И как лечить? DenProx Общие вопросы Delphi 0 19.03.2011 11:19
External excЕption C0000008 Владимир1988 Помощь студентам 4 03.02.2010 13:46