Форум: "Сети";
Текущий архив: 2008.12.28;
Скачать: [xml.tar.bz2];
Внизпроблема с DirectX (TDXPlay) Найти похожие ветки
← →
Богдан (2007-12-04 13:39) [0]Я использую объект типа TDXPlay для взаимодействия компьютеров по сети. Все чудно работает, когда этот объект создается в модуле формы основной программы: сессия открывается, сервер создается, другие пользователи присоединяются, сообщения принимаются. НО! Все перестает работать, когда этот объект помещаю в DLL. Нет, сессия также инициализируется без проблем, но процедура OnMessage НЕ ВЫЗЫВАЕТСЯ ! Т.е. объект работает, но почему-то не принимает сообщения. Кто-нибудь может помочь? При необходимости вышлю исходники на e-mail
← →
umbra © (2007-12-04 13:46) [1]
> процедура OnMessage НЕ ВЫЗЫВАЕТСЯ ! Т.е. объект работает,
> но почему-то не принимает сообщения.
потому что в длл нет окна и никакие сообщения никто не принимает. К сети это отношения не имеет.
> Кто-нибудь может помочь?
помочь может только создание цикла выборки оконных сообщений в длл
← →
MetalFan © (2007-12-04 14:11) [2]простите, но разве цикл выборки сообщений относится не к потоку?
при чем тут dll?
← →
umbra © (2007-12-04 14:25) [3]
> при чем тут dll?
даже если у потока есть цикл выборки сообщений, то как он узнает, что, получив вот_это_конкретное_сообщение, надо отправить его динамически загруженной длл? И как она его получит?
← →
Богдан (2007-12-04 14:59) [4]Коллеги, я в dll специально включил форму, она корректно отзывается извне dll. Но сообщения DXPLay"ем по-прежнему не принимаются. Может, дело в какой-нибудь глобальной регистрации этого DXPLay"я как приемщика сообщений? И, если все-таки отлавливать сообщения, то какие именно (в смысле, на какие сообщения реагировать)?
← →
Rouse_ © (2007-12-04 21:36) [5]ЦВС без окна?
← →
Сергей М. © (2007-12-05 10:18) [6]
> я в dll специально включил форму
Зачем ?
Только для того чтобы было куда-то "бросить" компонент TDXPlay ?
← →
Богдан (2007-12-06 11:33) [7]Компонент TDXPlay создается в run-time, на форму ничего не бросал. Просто в FormCreate вызываю
DXPLay := TDXPlay.create
. Но не помогло. Более того: обнаружил странное явление: форма, созданная в dll, вообще не принимает сообщений!. Обнаружил это так: в FormCreate назначаю процедуру обработки сообщений:Application.OnMessage := AppMessage;
а в процедуре AppMessage просто пихаю ID полученного сообщения в Memo на форме. Так вот, никаких сообщений форма не принимает! Исключение составляет тот момент, когда форма показывает диалоговое окошко ShowMessage: при показанном на экране диалог боксе Memo исправно заполняется сообщениями (опять же, только от окошка сообщения). В общем, проблема видится мне в том, то форма, созданная в dll, почему-то не принимает сообщений (как-бы не является приложением, что-ли...) :(
← →
Сергей М. © (2007-12-06 11:45) [8]
> форма, созданная в dll
Вот я и спрашиваю, зачем она там вообще нужна ?
← →
Богдан (2007-12-06 14:18) [9]Вообще она там не нужна. Но не работает ни с формой, не без нее. Форму я использовал для того, чтобы проверить механизм сообщений (доходят ли они до dll). Похоже, что не доходят, поэтому и DXPLay не чувствует входящих (DX-овых) сообщений
← →
Slym © (2007-12-06 14:35) [10]Суй в поток...
псевдокод:
TПоток.Execute;
begin
В потоке создаеш DXPLay
стандартный цикл выборки сообщений (while GetMesage do DispatchMessage)
убиваеш DXPLay
end;
← →
Сергей М. © (2007-12-06 14:53) [11]
> Богдан (06.12.07 14:18) [9]
> Вообще она там не нужна
Ну наконец-то дошли до истины)
Теперь след.вопрос - использует ли твоя библиотека и твое хост-приложение рантайм-пакеты ?
← →
Богдан (2007-12-07 08:47) [12]Рантайм-пакеты библиотека не используют ни библиотека, на хост-приложение. В опциях проектов (обоих) флажок "Build with runtime packages" отключен - все опции оставлены от установки Delphi (D7) по умолчанию. Попробую сунуть в поток...
← →
Сергей М. © (2007-12-07 09:00) [13]
> Рантайм-пакеты библиотека не используют
В таком случае модуль библиотеки и модуль хост-приложения используют разные (каждый свой собственный) объекты Application. В этом и кроется "засада".
← →
Богдан (2007-12-07 13:56) [14]Да, Сергей, я тоже так думаю. Что делать?
← →
Сергей М. © (2007-12-07 14:11) [15]
> Что делать?
Для начала определиться, будет ли твоя dll эксплуатироваться в т.ч. хост-процессами приложений, сверстанных в иных средах разработки (отличных от Делфи и ВСВ)
← →
Богдан (2007-12-07 14:35) [16]Да
← →
Сергей М. © (2007-12-07 14:47) [17]Тогда тебе прямая дорога к организации всей этой петрушки в доп.потоке.
Или к отказу от TDXPlay, логику работы которого ты изменить не в силах и не вправе
← →
Богдан (2007-12-09 11:00) [18]А какие могут быть варианты, если только из Delphi или BCB (мою dll использовать)?
← →
Сергей М. © (2007-12-10 08:27) [19]
> какие могут быть варианты
Альтернативный вариант - блокирующий ввод/вывод
← →
Богдан (2007-12-10 09:59) [20]В общем, запихнул я этот DXPlay в thread - тот же самый эффект (т.е. сообщения на принимает). Технология такая: DLL создает thread, в модуле thread"а создается DXPlay, назначаются процедуры... все то же самое. Единственное, что работает, так это метод Open - DXPlay инициализируется нормально, подключиться к нему все еще можно, но сообщения он не принимает. Что такое блокирующий ввод/вывод?
← →
Сергей М. © (2007-12-10 10:10) [21]
> запихнул я этот DXPlay в thread - тот же самый эффект
Значит неправильно "запихнул".
← →
Slym © (2007-12-10 10:19) [22]Богдан (10.12.07 9:59) [20]
назначаются процедуры...
А дальше долженбыть цикл выборки сообщений
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2008.12.28;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c