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

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

DLL, 2 потока и List [NT4, Win2k]


Andrey-k ©   (2002-04-28 23:02:00) 

Подскажите. Два процесса имеют по потоку из которых идет обращение к DLL-ке. DLL-ка выполняет роль посредника при передаче данных (передает указатели на Listы). Возможно ли:
лист созданный в первом потоке и засунутый в DLL фрикнуть во втором потоке предварительно разобрав содержимое?
Корректно ли это? И нужно ли использовать мьютексы?

В DLL сделан файл отображаемый в память.


Andrey-k   (2002-05-08 00:05:00) [1]

Mojete ne izveniatcia - ia eto ponimau za isklycheniem "физически один файл >проецируется< в адресные пространства процессов " - ix che yje stanovitcia dva?

i bydet li v etom slychae tochno ykazatel na obshyu pamiat ravnim dlia oboix processov - ne bydet , ia proveril, zapystiv dva prilojenia odnovremenno v otladke!

i bilo sozdano 2 faila otobrajaemix v pamiat s raznimi ykazateliami vmesto odnogo!
bred da?
no ia eto videl....




troits   (2002-05-07 14:14:00) [2]

А вообще, лучше бы тему назвать
DLL, List и 2 потока ;)


troits   (2002-05-07 14:08:00) [3]

Да нет никакого перемещения(то есть то, что оно есть, в данном случае неважно). Хэндл - это просто индекс в таблице, который назначается системой из своих, вообще говоря, не существенных, соображений. При загрузке код и данные DLL отображается в адресное пространство загружающего процесса. Они имеют смысл только для этого процесса. Дальше: для межпроцессного взаимодействия существует куча способов, один из которых - файлы, проецируемые в память -(CreateFileMapping/MapViewOfFile). При этом физически один файл проецируется в адресные пространства процессов и таким образом можно разделять данные между ними. Вот, собственно, и все.

Прошу прощения, если говорю очевидные вещи, просто у меня сложилось впечатление, что вы этого не понимаете.


Andrey-k   (2002-05-06 23:22:00) [4]

Насчет указателей согласен
даже если они переданы через файл отображаемый в памяти, тк данные эти другого процесса. OK я передаю данные.


Насчет хандлов
да хандлы разные могут быть. я вычитал, что это якобы из-за того "что DLL может быть перемещена в памяти одного из процессов или если каждый процесс переместил DLL по собственному базовому<-? адресу".

Тогда получается, что в выше приведенных кусках кода
происходит перемещение DLL во втором случае (еще вопрос в каком случае). И уже о доступе к общим данным (через MapViewOfFile ) нет речи. Вопрос - По ЧЕму идет перемещение?


troits   (2002-05-06 13:17:00) [5]


> Andrey-k © (05.05.02 17:34)
> как известно 2 процесса используют одну DLL, то они имеют ?>одинаковые хандлы на нее

Почему? IMHO вовсе нет. Использовать указатели в другом процессе тоже нельзя.


Andrey-k   (2002-05-05 17:51:00) [6]

А отсюда вопрос rastochnika по тому что идет через DLL
указатели или данные уже не имеет значение... тк я не вижу ни того ни другого.
Хотя возникает еще вопрос - сможет ли 2-ой процесс высвободить
память(по указателям листа) которая была выделена в первом :) Мне кажется необходимо гнать данные в DLL.

И освобождать уже в DLL соответственно по команде 2-го процесса.


Andrey-k   (2002-05-05 17:34:00) [7]

Мужики! Сорри что долго не отвечал по DLL. я погряз в след проблеме : как известно 2 процесса используют одну DLL, то они имеют одинаковые хандлы на нее , тогда почему хандл разный в след случаях:


program Project2;
uses
Windows,
Forms;
// U_Main in "U_Main.pas" {Form1};

{$R *.res}
var
xHandle:THandle; //DLL handle

begin
xHandle:=LoadLibrary(PChar("H:\Dll_Map.dll"));
Application.Initialize;
Application.Run;
end.


и тоже самое тока так :


program Project2;
uses
Windows;
// Forms;
// U_Main in "U_Main.pas" {Form1};


{$R *.res}
var
xHandle:THandle; //DLL handle

begin
xHandle:=LoadLibrary(PChar("H:\Dll_Map.dll"));
{Application.Initialize;
Application.Run;}
end.
От самой Dll-ки это не зависит. ответ похоже сидит в маленьком модуле Forms, тока смотреть его лень :) Идеи есть?


rastochnik   (2002-04-29 12:48:00) [8]

мне кажется, здесь нужно внимательно: через dll идут указатели (как ты говориш) или данные


Digitman   (2002-04-29 08:39:00) [9]

Достаточно использовать класс TThreadList. Объект синхронизации critical section в него уже встроен Борландом.


Наверх

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