
------------ Дoбавленo в 13.51:
Вот оно:

Ответов: 8948
Рейтинг: 824
|
|||
Neo, для многих пользователей форума кирилические названия файлов препятствуют их загрузке
![]() ------------ Дoбавленo в 13.51: Вот оно: ![]() |
|||
карма: 19 |
| ||
файлы: 1 | error_neo.jpg [101.5KB] [353] |
Ответов: 3889
Рейтинг: 362
|
|||
Neo писал(а): вот она, коварная! Помогите, пожалуйста!Помогаю, пожалуйста. Ваша критическая ошибка произошла в модуле DirectShowPlayer, вызванном, похоже, по точке метода мультиэлемента. Место вылета - строки 63 - 65 (если смотреть исходник компонента):
Сейчас трудно сказать, но, похоже, не действителен указатель на VideoWindow (там ноль), что приводит к вылету. Если бы у меня был стек (а в идеале ещё и дамп) вашего процесса во время вылета, я бы сказал значительно точнее. ------------ Дoбавленo в 14.50: Это метод doPlay, если интересно. |
|||
карма: 1 |
| ||
Голосовали: | Neo |
Разработчик
Ответов: 26300
Рейтинг: 2146
|
|||
1nd1g0 писал(а): не действителен указатель на VideoWindow (там ноль)Так он же должен быть действителен только после выполнения QueryInterface ![]() |
|||
карма: 22 |
|
Ответов: 3889
Рейтинг: 362
|
|||
nesco писал(а): Так он же должен быть действителен только после выполнения QueryInterfaceПардон, но я не про заполнение структуры, а про внутренние объектные указатели. Это объектное программирование в машинных кодах выглядит как бред сумасшедшего, указатели на указатели на структуры указателей на списки адресов вызовов методов. 70% кода и памяти занято под объектную хрень, 20% под ресурсы и данные и 10% - собственно, логика приложения. Сейчас попоробую сформулировать "по-объектному". В общем, на doPlay пришла какая-то фигня вместо параметров в регистрах ![]() |
|||
карма: 1 |
|
Разработчик
Ответов: 26300
Рейтинг: 2146
|
|||
1nd1g0 писал(а): В общем, на doPlay пришла какая-то фигня вместо параметров в регистрахВо мля, а с чего бы это ![]() В таком случае, должны косячить и другие переменные, если в стеке передается указатель не на таблицу переменных, а хрен знает что ![]() ------------ Дoбавленo в 15.42: Складывется впечетление, что кто-то ковыряется в куче потока, которому принадлежит DirectShowPlayer Слушай, а не происки ли это менеджера памяти, косячки же за ним наблюдались ![]() |
|||
карма: 22 |
|
Ответов: 3889
Рейтинг: 362
|
|||
Neo, а у Вас на именно этом исполнимом файле приложения ошибка всегда в этом месте возникает (51C99), или бывает в других?
nesco писал(а): В таком случае, должны косячить и другие переменные, если в стеке передается указатель не на таблицу переменных, а хрен знает чтКосячат не только переменные, внутренняя объектная структура MyGraphBuilder и список адресов процедур его методов тоже не действительны. Они инициализируются с опорой на те же адреса, что и всё остальное в этом юните, а опорный адрес как раз поступает как параметр в плеер, так что там всё раъезжается. У меня сильное подозрение на потоки, тем более, что плеер тоже их неявно создаёт. |
|||
карма: 1 |
|
Разработчик
Ответов: 26300
Рейтинг: 2146
|
|||
1nd1g0 писал(а): У меня сильное подозрение на потоки, тем более, что плеер их неявно создаётВо-во, и я про то же nesco писал(а): Складывется впечетление, что кто-то ковыряется в куче потока, которому принадлежит DirectShowPlayerА это может быть, если оформлена одна куча на все потоки, что вполне реально, тк библиотеки-то старые. Менеджер памяти тупо отдает другому потоку занятую память. ------------ Дoбавленo в 15.50: По-хорошему, при мультипоточности, каждый поток должен оформлть свою кучу, так и в MSDN рекомендуют, но вот как это реализовано в наших библиотеках, я глубоко не копал |
|||
карма: 22 |
|
Ответов: 3889
Рейтинг: 362
|
|||
nesco писал(а): По-хорошему, при мультипоточности, каждый поток должен оформлть свою кучу, так и в MSDN рекомендуют, но вот как это реализовано в наших библиотеках, я глубоко не копалЯ специально не исследовал этот вопрос, но , судя по тому, что тут потоки регистрируются прямо посреди процедуры и общаются с данными основного потока (не по прямым указателям, а именно через "объектную" чтоб её адресацию), используют структуры и объекты оттуда, контекст у всех абсолютно общий. |
|||
карма: 1 |
|
Разработчик
Ответов: 26300
Рейтинг: 2146
|
|||
1nd1g0 писал(а): контекст у всех абсолютно общийЭто не есть хорошо. Невозможно отследить все внутренние потоки, имеющие общий доступ к данным. Черт знает когда может возникнуть вот така ситуация, которую мы и наблюдаем. Кончится свободная память общей кучи (почему и не проявляется сразу), и менеджер начнет отдавать принадлежащую кому-то память, считая ее свободной, тк порожденные поток не зарезервировали себе место в этой куче |
|||
карма: 22 |
|
Ответов: 3889
Рейтинг: 362
|
|||
nesco писал(а): Это не есть хорошо.Зато без этого многопоточность в HiAsm было бы значииительно сложнее реализовать, потоки выглядели бы как контейнера, общались друг с другом и с основным через шлюзовые точки и т.д. Хотя, дополнительные неудобства окупились бы преимуществами, пожалуй. |
|||
карма: 1 |
|
Ответов: 704
Рейтинг: 7
|
|||
И еще: почему-то перед тем, как она появляется, пропадает звук у программы. Будь то BASS или обычный массив звуков, или даже проигрывание wav - мистика прямо
![]() 1nd1g0 писал(а): Neo, а у Вас на именно этом исполнимом файле приложения ошибка всегда в этом месте возникает (51C99), или бывает в других?Уже второй раз в нем. В других пока не наблюдал. Ниже вставил мультик, где этот коварный тип кроется. Там валяется и просто медиа плеер - пробовал менять "шило на мыло" - не получилось (или он не играл, или тоже ошибку кидал...). На doWork мультика приходит onSyncExec параллельного потока, который работает постоянно (FastStop:False).
Кстати, после появления ошибки все остальное продолжает успешно работать, кроме проигрывания любого звука. Только после нажатия на ок в ошибке - улетает. ------------ Дoбавленo в 19.48: Хотя и процессор часто грузит после этой шибки (а бывает и до нее), но звук уже не работает, после загрузки процессора до 100. |
|||
карма: 0 |
|
Ответов: 3889
Рейтинг: 362
|
|||
Neo писал(а): после появления ошибки все остальное продолжает успешно работать, кроме проигрывания любого звукаЕщё бы, вылетает-то отдельный поток. |
|||
карма: 1 |
|
Ответов: 704
Рейтинг: 7
|
|||
А я еще и думал почему это все, что должен выполнять этот поток - встало. Уже было даже решил что в нем что-то искать нужно, как обнаружил, что и проигрывание музыки из системного потока перестает работать. Плеер ведет себя, как вроде постоянно битые файлы и перебирает судорожно весь плейлист. После перезапуска программки все пашет нова до часа X.
------------ Дoбавленo в 20.04: И указатель на VideoWindow не задан намеренно. Мне же нужно было просто mp3 проиграть. ------------ Дoбавленo в 20.15: То есть это менеджер памяти шалит? Ну если дело в этом элементе - я мог бы его и на массив звуков заменить, но ведь и плеер самодельный тоже построен на "медиа плеер" - даже не знаю на что бы его можно заменить. Или это не конкретно его проблема, а "счастливое" стечение обстоятельств? ------------ Дoбавленo в 20.19: Под VideoWindow я имел идентификатор окна вывода. Верно? |
|||
карма: 0 |
|
Ответов: 3889
Рейтинг: 362
|
|||
Neo писал(а): "счастливое" стечение обстоятельств?Куда-то девается структура, создаваемая при инициализации. Наша коллегия склоняется к мысли, что она затирается сборщиком мусора т.к. зарегистрирована в основном потоке и, если долго там не используется, благополучно канет в Лету. Есть подозрение, что создатели менеджера памяти не догадывались о потенциальной необходимости многопоточности. В те годы процессоры многоядерные многие видели только на картинках и "подвисший" интерфейс приложения, занятого чем-то другим, был обычным делом. Попробуйте играть звуки основным потоком, скажем, проверяя по таймеру импонирующий Вам стек со списком звуков. Не забывайте защищаться от одновременного доступа по SafeMode. |
|||
карма: 1 |
|
Ответов: 704
Рейтинг: 7
|
|||
1nd1g0 писал(а): если долго там не используется, благополучно канет в ЛетуСомневаюсь. Один раз у меня оно держалось 3 суток, другой - 20 минут, третий - час и т.д.. |
|||
карма: 0 |
|