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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2015, 01:48   #1
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
Вопрос Ошибка при загрузке BMP

Здравствуйте.

Есть кусочек кода который работает рекурсивно:

Код:


function check(bmp:TBitmap;Path:string):string;
var
		bmp2:TBitmap;
		sRec: TSearchRec;
		isFound: boolean;
		str:string;
begin
	str:='';
    result:='';

    bmp2:=TBitmap.create();

		isFound := FindFirst( Path + '\*.*', faAnyFile, sRec ) = 0;
		while isFound do
			begin

				if ( sRec.Name <> '.' ) and ( sRec.Name <> '..' ) then
					begin
						if ( sRec.Attr and faDirectory ) = faDirectory then
						begin
						 Result:=check(bmp,Path + '\' + sRec.Name);
						 if Result<>'' then
						 begin
							isFound:=false;
							FindClose(sRec);
              bmp2.free;
						 end;
					end;
			  end;

	if (sRec.Attr=32) then
			begin
        bmp2.LoadFromFile(Path + '\' + sRec.Name);

					if(simple_search_img(bmp,bmp2)>=1) then
						begin
							  Result:=GetLastDir(Path);
                                                         break;
						  end;
           
     end;

			Application.ProcessMessages;
				isFound := FindNext( sRec ) = 0;
		end;


		FindClose(sRec);
	end;
Работает этот алгоритм каждые 2 секунды. Через 100-300 итераций возникает ошибка:

Цитата:
too many consecutive exceptions
Методов проб и ошибок заметил что это происходит при загрузке изображения в bmp2

Код:
bmp2.LoadFromFile(Path + '\' + sRec.Name);
Пробовал и через трай, файнели,эксцепт. Проверял существует ли файл до загрузки. Результат один и тот же.

ПОдскажите пожалуйста, где я налажал.
DarkHacker вне форума Ответить с цитированием
Старый 06.06.2015, 03:11   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

bmp2.LoadFromFile стоит после деструктора.

з.ы. скажи, неужели ты и правда так код пишешь? я ослеп, пока читал.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.06.2015, 11:55   #3
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
bmp2.LoadFromFile стоит после деструктора.

з.ы. скажи, неужели ты и правда так код пишешь? я ослеп, пока читал.
bmp2.free; стоит если найден шаблон, и следовательно освобождаю память.

Код предоставлен выше одна из итераций попыток. Если поставить деструктор вниз на выход из цикла ничего не поменяется.

Что не так в коде? Вы видимо не разобрались, если посчитали что деструктор вызывается раньше.
И если бы вы были правы, ошибка была всегда, а не по истечению времени.
DarkHacker вне форума Ответить с цитированием
Старый 06.06.2015, 12:03   #4
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Код:
bmp2:=TBitmap.create();
......
         bmp2.free;
......
         bmp2.LoadFromFile(Path + '\' + sRec.Name);
LoadFromFile нельзя вызывать после того, как уничтожили bmp2 методом free
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 06.06.2015, 12:05   #5
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Цитата:
Сообщение от newerow1989 Посмотреть сообщение
Код:
bmp2:=TBitmap.create();
......
         bmp2.free;
......
         bmp2.LoadFromFile(Path + '\' + sRec.Name);
LoadFromFile нельзя вызывать после того, как уничтожили bmp2 методом free
Код предоставлен выше одна из итераций попыток. Если поставить деструктор вниз на выход из цикла ничего не поменяется. Деструктор применяется ТОЛЬКО КОГДА ВЫПОЛНЕНО УСЛОВИЯ ДЛЯ ВЫХОДА ИЗ ЦИКЛА. Код работает исправно, но по истечению времени начинаются ошибки.
DarkHacker вне форума Ответить с цитированием
Старый 06.06.2015, 12:17   #6
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Попробуйте временно отключить bmp2.free; (поставить 2 косые черты // )
Код:
//bmp2.free;
Будут появляться ошибки?
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 06.06.2015, 12:31   #7
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Цитата:
Сообщение от newerow1989 Посмотреть сообщение
Попробуйте временно отключить bmp2.free; (поставить 2 косые черты // )
Код:
//bmp2.free;
Будут появляться ошибки?
ошибка нехватки памяти.
Вы видимо все равно думаете, что я его (деструктор) не там поставил)))
DarkHacker вне форума Ответить с цитированием
Старый 06.06.2015, 12:33   #8
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Ставьте деструктор в конце функции после последнего FindClose(sRec); перед end;
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 06.06.2015, 12:34   #9
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Цитата:
Сообщение от newerow1989 Посмотреть сообщение
Ставьте деструктор в конце функции после FindClose(sRec); перед end;
Я так делал, я даже переделывал функцию так чтобы не создавать внутри тела никаких бмп, а использовать ранее созданные до вызова. Это все не дает результатов.
DarkHacker вне форума Ответить с цитированием
Старый 06.06.2015, 12:36   #10
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Тогда опишите переменную bmp2:TBitmap; вне функции (сделайте ее глобальной), а bmp2.free; уберите (или отключите)
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при загрузке формы CBETJIbIu Microsoft Office Access 2 03.02.2012 23:01
Ошибка при загрузке tae1980 Microsoft Office Excel 2 23.01.2012 10:58
Ошибка: Выбора ОС при загрузке Foxx Операционные системы общие вопросы 5 11.09.2009 01:28
ОШИБКА ПРИ ЗАГРУЗКЕ Костян Пират Операционные системы общие вопросы 5 21.02.2009 12:14
Ошибка при загрузке.... Ronni10 Операционные системы общие вопросы 6 10.01.2008 22:20