|
Модераторы: Poseidon, Snowy, bems, MetalFan |
|
Joyer |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 22.1.2008 Репутация: нет Всего: нет |
Здравствуйте!
Подскажите пожалуйста что такое Page Faults или ошибки страниц? У меня программа загружает изображения в отдельном потоке. При этом число Page Faults увеличивается на 10,000 за каждый цикл работы потока. Очень прошу помочь, так как вопрос срочный, а решить не получается не первые сутки. Ниже приведена упрощенная часть кода: Почему эти самые Page Faults увеличиваются на 2000 при попытке задать ширину битмапу?
P.S. Попытки заменить менеджер памяти на FastMM4 не увенчались успехом. |
|||
|
||||
Rrader |
|
|||
Inspired =) Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Не видно ни одного Synchronize, там где следовало бы
|
|||
|
||||
CodeMonkey |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
А где следовало бы? )) Page faults и на русском. Не понял, чем они вас так испугали. Работаете с большими объёмами данных - ну куда же без них? -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Rrader |
|
|||
Inspired =) Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
||||
|
||||
CodeMonkey |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Если NextTexture - это TBitmap, да плюс код формы не обращается к нему в промежутке, между созданием потока и need_to_reload_textures := True;, то почему-бы и нет? Согласен, некрасиво. Но работоспособно. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Joyer |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 22.1.2008 Репутация: нет Всего: нет |
Спасибо огромное за ссылки и помощь в вопросе.
На одном из форумов мне подсказали, что Screen это VCL объект и без синхронизации не обойтись. Я исправлю и перепроверю. Действительно, NextTexture это bitmap, но он используется в одном месте, для загрузки текстуры из битмапа и только при установленном need_to_reload_textures = True. Мне один умный человек подсказал, что в DirectX-овые текстуры желательно писать из того же потока, который инициализировал Direct 3D-шный объект. Есть вопрос по теме: Почему возникает несколько Page Faults при выполнении вот этого кода
или
проверял с разными менеджерами памяти, в Delphi 7, Delphi 2007. Причем NewBitMap и jpeg я объявлял как в начале процедуры, так и в объявлении объекта TMyThread - результат одинаковый. Неужели нельзя избавиться от этих Page Faults в Delphi? |
||||
|
|||||
Rrader |
|
||||
Inspired =) Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Такого рода ошибки - нормальный режим работы, и Delphi обвинять не стоит в этом. Вот пример:
Этот пример показывает, что число ошибок страниц пропорционально объему стековой переменной, расположенной в стеке главного потока. При попытке напрямую записать память по такому дальнему смещению по логике вещей должно произойти страшное исключение - мы попадаем мимо охранной страницы (PAGE_GUARD) и будем перхвачены как нарушители доступа. Delphi таких вещей не допускает, и делает невидимую прогулку по памяти, чтобы сместить охранную страницу "пониже". Это сопровождается исключениями страниц. У меня произошло при нажатии кнопки где-то 250 исключений. Добавлено @ 16:01
Я поначалу тоже к этому склонялся, но затем передумал и попросил себя убить, апстенку Нужно знать, какие именно действия выполняет основной поток с этим Screen (я этого не знаю, но думаю, что ничего "такого" не делается). Screen глобален, это стоит учитывать. Для подстраховки можно синхронизировать... Это сообщение отредактировал(а) Rrader - 17.1.2009, 16:39 |
||||
|
|||||
CodeMonkey |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
...вы так стремитесь от них избавиться, как будто это ошибки... -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
bems |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
ну если они происходят в твоем коде, то можно уменьшить их число переписав алгоритм так, чтобы адреса данных, к которым ты обращаешься лежали как можно ближе друг к другу
-------------------- Обижено школьников: 8 |
|||
|
||||
Joyer |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 22.1.2008 Репутация: нет Всего: нет |
Rrader: Спасибо огромное, крайне исчерпывающе - точный ответ на интересующий вопрос.
bems Спасибо за совет, не думаю, что у меня это получиться реализовать, но в любом случае спасибо. Фактически, меня не волнует кол-во этих ошибок. Меня беспокоит то, что моя программа зависает. А единственный претендент - Page faults. Дело в том, что программа делает операции по циклу. Поток загрузил картинку, основной поток ее показал. Так происходит около 200 раз, а потом прога виснет. Все потоки с состоянии Wait:UserRequest. Первое о чем я подумал, - утечка памяти, но за час работы в таком режиме объем занимаемой памяти не увеличился. Единственное, что менялось - количество Page Faults. Вот собственно и причина моего интереса к данному вопросу. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Совершенно никак не связанные вещи. Попробуйте показать, как вы используете поток (похоже, Rrader может быть прав и у вас проблемы с синхронизацией). -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Joyer |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 22.1.2008 Репутация: нет Всего: нет |
Действительно проблемы с потоками.
Переписал все еще раз перечитав: http://forum.vingrad.ru/forum/topic-60076.html Петровичу Спасибо! Вроде как стало лучше... Пока не ясно.
Вот эта процедура запускается, когда рабочий поток посылает сообщение основному
Запуск потока:
и вот теперь есть проблема, которую не могу побороть: Я хотел считывать обработанный bitmap в TForm1.HandleThreadCompletion. Но, при данном коде рабочего потока - MyThread.newbitmap.free будет выполнена, и не факт, что основной поток успеет обработать сообщение. Освободить TMyThread.newbitmap в TForm1.HandleThreadCompletion не удается. Если ее не освобождать - происходит утечка. Вообще "извлечь" данные TMyThread.newbitmap по окончанию TMyThread.Execute удается лишь извращенными способами вроде записи на жесткий диск или в Tmemorystream... Подскажите пожалуйста, как поправить код, чтобы корректно присваивать Form1.NextTexture изображение полученное в MyThread1.NewBitmap... |
||||||||
|
|||||||||
CodeMonkey |
|
||||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Лучше назначьте потоку событие OnTerminate:
OnTerminate вызывается в конце работы потока (сразу после выхода из Execute), причём вызывается через Synchronize в главном потоке. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
||||||
|
|||||||
Joyer |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 22.1.2008 Репутация: нет Всего: нет |
Я как раз и отказался от схемы, с использованием OnTerminate.
Вроде нашел ответ здесь http://www.delphikingdom.com/asp/answer.asp?IDAnswer=67842. Еще раз все проверю - если вопрос решен ветку можно закрывать |
|||
|
||||
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |