Вверх ↑
Этот топик читают: Гость
Ответов: 8948
Рейтинг: 824
#31: 2011-10-14 13:51:07 ЛС | профиль | цитата
Neo, для многих пользователей форума кирилические названия файлов препятствуют их загрузке
------------ Дoбавленo в 13.51:
Вот оно:
error_neo.jpg
карма: 19

0
файлы: 1error_neo.jpg [101.5KB] [353]
Ответов: 3889
Рейтинг: 362
#32: 2011-10-14 14:50:21 ЛС | профиль | цитата
Neo писал(а):
вот она, коварная! Помогите, пожалуйста!

Помогаю, пожалуйста. Ваша критическая ошибка произошла в модуле DirectShowPlayer, вызванном, похоже, по точке метода мультиэлемента. Место вылета - строки 63 - 65 (если смотреть исходник компонента):


	MyGraphBuilder.RenderFile(PWideChar(WideString(fn)),nil);
MyGraphBuilder.QueryInterface(IID_IVideoWindow,VideoWindow);

Сейчас трудно сказать, но, похоже, не действителен указатель на VideoWindow (там ноль), что приводит к вылету. Если бы у меня был стек (а в идеале ещё и дамп) вашего процесса во время вылета, я бы сказал значительно точнее.
------------ Дoбавленo в 14.50:
Это метод doPlay, если интересно.
карма: 1

1
Голосовали:Neo
Разработчик
Ответов: 26300
Рейтинг: 2146
#33: 2011-10-14 15:01:38 ЛС | профиль | цитата
1nd1g0 писал(а):
не действителен указатель на VideoWindow (там ноль)

Так он же должен быть действителен только после выполнения QueryInterface
карма: 22

0
Ответов: 3889
Рейтинг: 362
#34: 2011-10-14 15:24:32 ЛС | профиль | цитата
nesco писал(а):
Так он же должен быть действителен только после выполнения QueryInterface

Пардон, но я не про заполнение структуры, а про внутренние объектные указатели. Это объектное программирование в машинных кодах выглядит как бред сумасшедшего, указатели на указатели на структуры указателей на списки адресов вызовов методов. 70% кода и памяти занято под объектную хрень, 20% под ресурсы и данные и 10% - собственно, логика приложения. Сейчас попоробую сформулировать "по-объектному".

В общем, на doPlay пришла какая-то фигня вместо параметров в регистрах
карма: 1

0
Разработчик
Ответов: 26300
Рейтинг: 2146
#35: 2011-10-14 15:42:20 ЛС | профиль | цитата
1nd1g0 писал(а):
В общем, на doPlay пришла какая-то фигня вместо параметров в регистрах

Во мля, а с чего бы это Мы же не передаем VideoWindow как параметр, это же глобальная перемнная класса.
В таком случае, должны косячить и другие переменные, если в стеке передается указатель не на таблицу переменных, а хрен знает что
------------ Дoбавленo в 15.42:
Складывется впечетление, что кто-то ковыряется в куче потока, которому принадлежит DirectShowPlayer
Слушай, а не происки ли это менеджера памяти, косячки же за ним наблюдались
карма: 22

0
Ответов: 3889
Рейтинг: 362
#36: 2011-10-14 15:44:58 ЛС | профиль | цитата
Neo, а у Вас на именно этом исполнимом файле приложения ошибка всегда в этом месте возникает (51C99), или бывает в других?
nesco писал(а):
В таком случае, должны косячить и другие переменные, если в стеке передается указатель не на таблицу переменных, а хрен знает чт

Косячат не только переменные, внутренняя объектная структура MyGraphBuilder и список адресов процедур его методов тоже не действительны. Они инициализируются с опорой на те же адреса, что и всё остальное в этом юните, а опорный адрес как раз поступает как параметр в плеер, так что там всё раъезжается. У меня сильное подозрение на потоки, тем более, что плеер тоже их неявно создаёт.
карма: 1

0
Разработчик
Ответов: 26300
Рейтинг: 2146
#37: 2011-10-14 15:50:42 ЛС | профиль | цитата
1nd1g0 писал(а):
У меня сильное подозрение на потоки, тем более, что плеер их неявно создаёт

Во-во, и я про то же
nesco писал(а):
Складывется впечетление, что кто-то ковыряется в куче потока, которому принадлежит DirectShowPlayer

А это может быть, если оформлена одна куча на все потоки, что вполне реально, тк библиотеки-то старые. Менеджер памяти тупо отдает другому потоку занятую память.
------------ Дoбавленo в 15.50:
По-хорошему, при мультипоточности, каждый поток должен оформлть свою кучу, так и в MSDN рекомендуют, но вот как это реализовано в наших библиотеках, я глубоко не копал
карма: 22

0
Ответов: 3889
Рейтинг: 362
#38: 2011-10-14 16:10:23 ЛС | профиль | цитата
nesco писал(а):
По-хорошему, при мультипоточности, каждый поток должен оформлть свою кучу, так и в MSDN рекомендуют, но вот как это реализовано в наших библиотеках, я глубоко не копал

Я специально не исследовал этот вопрос, но , судя по тому, что тут потоки регистрируются прямо посреди процедуры и общаются с данными основного потока (не по прямым указателям, а именно через "объектную" чтоб её адресацию), используют структуры и объекты оттуда, контекст у всех абсолютно общий.
карма: 1

0
Разработчик
Ответов: 26300
Рейтинг: 2146
#39: 2011-10-14 16:26:17 ЛС | профиль | цитата
1nd1g0 писал(а):
контекст у всех абсолютно общий

Это не есть хорошо. Невозможно отследить все внутренние потоки, имеющие общий доступ к данным. Черт знает когда может возникнуть вот така ситуация, которую мы и наблюдаем. Кончится свободная память общей кучи (почему и не проявляется сразу), и менеджер начнет отдавать принадлежащую кому-то память, считая ее свободной, тк порожденные поток не зарезервировали себе место в этой куче
карма: 22

0
Ответов: 3889
Рейтинг: 362
#40: 2011-10-14 16:35:16 ЛС | профиль | цитата
nesco писал(а):
Это не есть хорошо.

Зато без этого многопоточность в HiAsm было бы значииительно сложнее реализовать, потоки выглядели бы как контейнера, общались друг с другом и с основным через шлюзовые точки и т.д. Хотя, дополнительные неудобства окупились бы преимуществами, пожалуй.
карма: 1

0
Ответов: 704
Рейтинг: 7
#41: 2011-10-14 19:48:16 ЛС | профиль | цитата
И еще: почему-то перед тем, как она появляется, пропадает звук у программы. Будь то BASS или обычный массив звуков, или даже проигрывание wav - мистика прямо

1nd1g0 писал(а):
Neo, а у Вас на именно этом исполнимом файле приложения ошибка всегда в этом месте возникает (51C99), или бывает в других?

Уже второй раз в нем. В других пока не наблюдал.
Ниже вставил мультик, где этот коварный тип кроется. Там валяется и просто медиа плеер - пробовал менять "шило на мыло" - не получилось (или он не играл, или тоже ошибку кидал...).
На doWork мультика приходит onSyncExec параллельного потока, который работает постоянно (FastStop:False).


Add(MultiElement,10531500,2576,126)
{
}
BEGIN_SDK
Add(EditMulti,4838220,21,21)
{
EventCount=1
WorkCount=2
Width=475
link(doWork1,16768235:doEvent1,[(28,27)(28,111)])
link(doWork2,16768235:doEvent2,[(28,34)(28,118)])
}
Add(MediaPlayer,1338729,245,154)
{
Filename="C:Documents and SettingsAdilja_domРабочий столДом_миниФразыDostup_razreshon.mp3"
}
Add(Hub,451173,126,105)
{
InCount=2
OutCount=1
link(onEvent1,12773462:doPlay,[])
}
Add(Timer,8472488,308,112)
{
Interval=2000
Enable=1
AutoStop=1
link(onTimer,451173:doEvent2,[(352,118)(352,106)(114,106)(114,118)])
}
Add(If_else,10844544,252,105)
{
Op2=Integer(2)
link(onTrue,13335:doData,[])
link(onFalse,8472488:doTimer,[])
}
Add(Counter,9943069,210,105)
{
link(onNext,10844544:doCompare,[])
}
Add(Hub,7134242,77,105)
{
link(onEvent1,9943069:doReset,[(151,111)(151,125)])
link(onEvent2,451173:doEvent1,[(109,118)(109,111)])
}
Add(Hub,10796632,434,77)
{
InCount=2
OutCount=1
link(onEvent1,4838220:onEvent1,[(472,83)(472,27)])
}
Add(Hub,16768235,35,105)
{
InCount=2
link(onEvent1,11330319:doData,[(217,111)(217,62)])
link(onEvent2,7134242:doEvent1,[(63,118)(63,111)])
}
Add(DoData,11330319,385,56)
{
Data=String(002=L)
link(onEventData,10796632:doEvent1,[(425,62)(425,83)])
}
Add(DoData,13335,385,105)
{
Data=String(002=l)
link(onEventData,10796632:doEvent2,[(425,111)(425,90)])
}
Add(DirectShowPlayer,12773462,161,105)
{
Filename="C:Documents and SettingsAdilja_domРабочий столДом_миниФразыDostup_razreshon.mp3"
link(onEndPlay,9943069:doNext,[])
}
END_SDK


------------ Дoбавленo в 19.47:
Кстати, после появления ошибки все остальное продолжает успешно работать, кроме проигрывания любого звука. Только после нажатия на ок в ошибке - улетает.
------------ Дoбавленo в 19.48:
Хотя и процессор часто грузит после этой шибки (а бывает и до нее), но звук уже не работает, после загрузки процессора до 100.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#42: 2011-10-14 19:49:44 ЛС | профиль | цитата
Neo писал(а):
после появления ошибки все остальное продолжает успешно работать, кроме проигрывания любого звука

Ещё бы, вылетает-то отдельный поток.
карма: 1

0
Ответов: 704
Рейтинг: 7
#43: 2011-10-14 20:19:26 ЛС | профиль | цитата
А я еще и думал почему это все, что должен выполнять этот поток - встало. Уже было даже решил что в нем что-то искать нужно, как обнаружил, что и проигрывание музыки из системного потока перестает работать. Плеер ведет себя, как вроде постоянно битые файлы и перебирает судорожно весь плейлист. После перезапуска программки все пашет нова до часа X.
------------ Дoбавленo в 20.04:
И указатель на VideoWindow не задан намеренно. Мне же нужно было просто mp3 проиграть.
------------ Дoбавленo в 20.15:
То есть это менеджер памяти шалит? Ну если дело в этом элементе - я мог бы его и на массив звуков заменить, но ведь и плеер самодельный тоже построен на "медиа плеер" - даже не знаю на что бы его можно заменить. Или это не конкретно его проблема, а "счастливое" стечение обстоятельств?
------------ Дoбавленo в 20.19:
Под VideoWindow я имел идентификатор окна вывода. Верно?
карма: 0

0
Ответов: 3889
Рейтинг: 362
#44: 2011-10-14 20:43:39 ЛС | профиль | цитата
Neo писал(а):
"счастливое" стечение обстоятельств?

Куда-то девается структура, создаваемая при инициализации. Наша коллегия склоняется к мысли, что она затирается сборщиком мусора т.к. зарегистрирована в основном потоке и, если долго там не используется, благополучно канет в Лету. Есть подозрение, что создатели менеджера памяти не догадывались о потенциальной необходимости многопоточности. В те годы процессоры многоядерные многие видели только на картинках и "подвисший" интерфейс приложения, занятого чем-то другим, был обычным делом. Попробуйте играть звуки основным потоком, скажем, проверяя по таймеру импонирующий Вам стек со списком звуков. Не забывайте защищаться от одновременного доступа по SafeMode.
карма: 1

0
Ответов: 704
Рейтинг: 7
#45: 2011-10-14 21:55:54 ЛС | профиль | цитата
1nd1g0 писал(а):
если долго там не используется, благополучно канет в Лету

Сомневаюсь. Один раз у меня оно держалось 3 суток, другой - 20 минут, третий - час и т.д..
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)