Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Приложение жоско залипает [D7, WinXP]


Karabaz ©   (2012-02-02 00:42:00) 

Есть простейшая рыба - форма с кнопкой,
по кнопке работает простейший код:

assignfile(textfile);
while not EOF(textfile) do begin
 readln(textfile, str);
end;
CloseFile(textfile);

После CloseFile залипает все намертво минуты на 3.
Даже диспетчер задач запустить невозможно.

Куда рыть?
винда 7/x64, Delphi 7


Karabaz   (2012-02-02 12:08:00) [1]


> Проверь под x86, на меньшем файле, на компьютере соседа
> по палате, в конце концов.
> Напиши результаты сюда.

Согласен, именно этим пока занимаюсь.


> Прочитать файл размером в 10 МБ — это не проблема для современных
> машин.


В моем случае файл размером около 200М, но как мне кажется это не имеет значения. Как мне кажется потребление памяти растет с каждой строкой, потому что где-то что-то копится и потом резко освобождается.


И. Павел   (2012-02-02 12:05:00) [2]

> [17] Karabaz   (02.02.12 12:00)

Меньше кипятись, больше изучай проблему. Проверь под x86, на меньшем файле, на компьютере соседа по палате, в конце концов.
Напиши результаты сюда.

Вот не липнет у меня твой пример. Прочитать файл размером в 10 МБ — это не проблема для современных машин.


Karabaz   (2012-02-02 12:00:00) [3]


> Еще не хватало на него обращать внимание, он наверно и сам
> знает кем помрет.

И кем же я помру, позвольте поинтересовацо?
Я профессионал в другой области и могу себе позволить не знать всего остального вообще. А чел, который себя позиционирует себя как дельфист, помогать тут якобы пришел, но только несет ахинею про нерабочий код, это уже обычный тролль-профан.

Занятно,
это мой второй вопрос на этом форуме и на первый ( http://www.delphimaster.ru/cgi-bin/forum.pl?n=3&id=1325924494) вопрос была примерно такая же история: 60% ответов была абсолютная порфанация, индусы завидуют. И только потом появились адекватные люди. Может это особенность Delphi, низкий порог вхождения?

Посему просьба - если кто не знает ответ или считает этот код не рабочим (кроме Anatoly Podgoretsky, для него я персонально могу выложить исходники или залить видео на ютуп, если он готов будет согласиться, что он профан-пустозвон), то не спешите показывать себя болтунами.


Karabaz   (2012-02-02 11:50:00) [4]


> Эта рыба не рабочая

Anatoly Podgoretsky, если я сейчас выложу исходники проекта с именно этим кодом, который работает как я описал, ты открыто признаешь, что ты пустозвон?


Anatoly Podgoretsky   (2012-02-02 11:15:00) [5]


> у нас не курят... намек понят?

Еще не хватало на него обращать внимание, он наверно и сам знает кем помрет.


Anatoly Podgoretsky   (2012-02-02 11:14:00) [6]

> Karabaz  (02.02.2012 00:42:00)  [0]

Эта рыба не рабочая


brother   (2012-02-02 11:07:00) [7]

у нас не курят... намек понят?


Karabaz   (2012-02-02 10:23:00) [8]

>> Не ври, ведь здесь нет обработки сообщений.
То есть ты проверил и убедился что заголовок формы не перерисовывается без ProcessMessages?
или просто так пукнул?


Karabaz   (2012-02-02 10:18:00) [9]

Кстати попробую сегодня именно это скомпилированное приложение на XP


Karabaz   (2012-02-02 10:16:00) [10]


> > Вот реальный код (пока без ProcessMessages, он не решает).
>
> в новом проекте на D7 в WinXP залипания от этого кода нет
> (хотя он и "кривой" но тут не суть). антивирус отключи..
> .

Нет антивируса. Да и откуда ему влиять, если залипание при выходе из процедуры.

У меня есть подозрения, что дело может быть в том, что дело происходит на win7-x64


Anatoly Podgoretsky   (2012-02-02 09:56:00) [11]

> Karabaz  (02.02.2012 01:29:04)  [4]

Не ври, ведь здесь нет обработки сообщений.


sniknik   (2012-02-02 09:41:00) [12]

> Вот реальный код (пока без ProcessMessages, он не решает).
в новом проекте на D7 в WinXP залипания от этого кода нет (хотя он и "кривой" но тут не суть). антивирус отключи...


sniknik   (2012-02-02 08:10:00) [13]

> Без ProcessMessages невозможно.
изменение каптион-а формы делается через сообщения, а отрисовка его "на винде", т.что...


Karabaz   (2012-02-02 01:47:00) [14]

>> Опять пример не реальный.

Еще раз для тех кто в танке.
Это выше РЕАЛЬНЫЙ код, выполнение которого ведет себя так как я описал.
Вызов ProcessMessages был когда-то раньше, до того как я писал начальный пост. Сейчас его нет, т.к. залипание процедуры на выходе он не решает.


Германн   (2012-02-02 01:40:00) [15]


> Karabaz   (02.02.12 01:29) [4]
>
> Пока файл читается
> а) цифры в заголовке формы бегут как и полагается
> б) мышью можно двигать
>

Без ProcessMessages невозможно. Опять пример не реальный.


Karabaz   (2012-02-02 01:29:00) [16]

Пока файл читается
а) цифры в заголовке формы бегут как и полагается
б) мышью можно двигать

ничего другого сделать невозможно - ни сменить фокус окна (мышью или alt-tab), ни нажать кнопку пуск, ничего.


Karabaz   (2012-02-02 01:20:00) [17]

Вот реальный код (пока без ProcessMessages, он не решает).

procedure blabla();
var
 f: textfile;
 str: string;
 i: integer;
begin
 i := 0;
 AssignFile(f, 'C:\somefile.txt');
 Reset(f);
 while not EOF(f) do begin
    str := '';
    ReadLn(f, str);
    i := i + 1;
    frmMain.Caption := IntToStr(i);
 end;
 frmMain.Caption := 'before close';
 CloseFile(f);
 frmMain.Caption := 'after close';
end;

Во время выполения все залипает, приложение отнимает весь CPU и отжирает около 1Гб (!!!) памяти. Т.е. пока читается эти 1.5 миллиона строк скушанная память в диспетчере задач растет, после чтения всех строк файла (caption = after close) все (вся система, т.е. мне не достается положенного CPU вообще) залипает наглухо минуты на 3. После этого в диспетчере память резко падает до того значение которое было перед запуском и все ок. Пока не запустим этот код снова.

Что здесь не так?


Германн   (2012-02-02 01:02:00) [18]


> Куда рыть?

Для начала представить реальный код, который можно скомилировать и проверить.


Karabaz   (2012-02-02 00:47:00) [19]

Добавлю:
1)в файле более миллиона строк. Пробовал каждые 10 тыс итераций делать
application.ProcessMessages - не помогает.

2)
Причем, возможно это наведет вас на правильные мысли, сначала я открываю OpenDialog, из которого имя файла посылаю в процедуру.
Так вот OpenDialog остается на экране несколько секунд после того как я нажал ОК и обработка пошла, даже после ProcessMessages не пропадает.

3) там где я выше написал ReadLn, там же ниже есть код
i := i + 1;
form.caption = IntToStr(i);
вот почему я вижу что обработка идет

----------------------------
у меня подозрение, что форма где-то чего-то накапливает и после выхода из процедуры что-то накопленное освобождает или обрабатывает.


Наверх

Титульная страница Поиск, карта сайта Написать письмо