![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.
и тоже самое тока так :
От самой Dll-ки это не зависит. ответ похоже сидит в маленьком модуле Forms, тока смотреть его лень :) Идеи есть?
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.
rastochnik (2002-04-29 12:48:00) [8]мне кажется, здесь нужно внимательно: через dll идут указатели (как ты говориш) или данные
Digitman (2002-04-29 08:39:00) [9]Достаточно использовать класс TThreadList. Объект синхронизации critical section в него уже встроен Борландом.