![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
100 раз...передача данных в DLL
Bes © (2005-02-11 01:12:00)Мастера!
Есть серверная часть к которой могут подлючаться плагины (DLL)
так вот... мне надо обеспечить устойчивую связь между плагинами и осн. прогой.
я передаю указатель на класс TStringList
объект создаю в основной программе и туда сюда его гоняю...
это нормально и правильно? всмысле с памятью и скоростью?
не лучше ли использовать PChar
Eraser (2005-02-11 19:27:00) [1]Bes ©
И правильно ))
Bes (2005-02-11 19:12:00) [2]не плАнируется
Eraser (2005-02-11 18:51:00) [3]Bes ©
кстати там и там подключаю ShareMem..
Кстати, если в дальнейшем планируется переписывать сервер на MSVC++, то эти плагины работать не будут.
Digitman (2005-02-11 15:33:00) [4]
интересно а если
эксперименты должны быть ОСОЗНАННЫМИ !
TModuleClass=class
..
public
destructor Destroy; override;
end;
destructor TModuleClass.Destroy;
begin
ToModule.Free;
FromModule.Free;
inherited;
end;
> перед оваемые
русский язык в школе учил или нет ?
для проверки правописания гласной в корне слова следует подобрать однокоренное слово, где сомнительная гласная имеет ударение ..
вот так хотя бы :
перед А ча
!!
это уже не очепятка, глаз это режет ..
Bes (2005-02-11 15:11:00) [5]интересно а если в
Free
а сделать так?
destructor TModuleClass.Free;
begin
if Assigned(ToModule) then ToModule.Free;
if Assigned(FromModule) then FromModule.Free;
inherited Free;
end;
Digitman (2005-02-11 15:04:00) [6]
> насчет Free
метод Free есть метод класса TObject, в ходе исполнения которого вызывается вирт.метод-деструктор объекта-наследника класса TObject ...
в дан.случае наследником класса TObject (прямым) у тебя является тыой класс TModuleClass, поэтому все что от тебя требовалось - объявить и реализовать в своем классе
destructor Destroy; override;
в теле перекрытого Destroy-метода ты вправе освободить все ресурсы, занятые твоим классом в ходе его конструирования и работы его методов
SomeObject.Free делает следующее :
- проверяется, не nil-ли SomeObject;
- если не nil, то вызывается его метод-деструктор Destroy, если ты его перекрыл, а если не перекрыл, то метод-деструктор Destroy предка
Bes (2005-02-11 14:55:00) [7]тогда где почитать "про единый менеджер памяти",
а насчет Free... ну мне же надо мои TStringListы убить или как?
трасировку делал.. вылетает при FreeLibrary
Digitman (2005-02-11 14:44:00) [8]ох и нахреновертил ты ... и в стратегии , и в коде ее реализующем ..
даже не знаю с чего начать "бомбить" тебя за это безобразие ...
> 1) а сам класс TStringList рационально ли распеделяет память,
> т.е. потрошить его надо или нет?
вполне рационально.
не представляю, как ты вознамерился его "потрошить" и что под этим подразумевается ..
> 2) не очень понял насчет единого менеджера памяти
тогда бросай свои "серверы" и "плагины" и штудируй теорию ..
в части того как Борланд реализует распределение/перераспределение/освобождение памяти, используемой в программах под его управлением ..
> destructor Free;
что еще за Free ?
TObject уже имеет метод класса Free, имеющий строго определенное назначение
> при закрытии проги "RunTime 217"... читал о 216 ошибке,
> так что думаю что 217 что-то похожее...где-то я намутил
> что-то..
> 3) почему вылетает 217 ошибка
про встроенный в Делфи отладчик и пошаговую трассировку кода слышал что-нибудь ?
Bes (2005-02-11 14:28:00) [9]у меня два вопроса
1) а сам класс TStringList рационально ли распеделяет память, т.е. потрошить его надо или нет?
2) не очень понял насчет единого менеджера памяти...
вообще у меня происходит так
для каждой DLL создается класс TModuleClass
TModuleClass=class
DLLHandle:THandle;
loaded:boolean;
name:string[20];
version:string[20];
buildate:string[10];
block:boolean;
TTL:integer;
DateTime:TdateTime;
ToModule:TStringList; //это класс на данные передоваемые в модуль
FromModule:TStringList; //это класс на данные передоваемые из модуля в основное преложение
Filename:string[255];
Path:string[255];
open:procedure (ModuleID:pointer);stdcall; //процедура в длл передаю указатель на класс Модуля
readmsg:procedure; // "собые" на поступление команды.
Protocol:TSTringList;
constructor Create;
destructor Free;
end;
ситуация такая.... т.к. прога у меня сервер, то надо обепечить паралельное выполнение процедур в модуле.
так вот при поступлении команды от клиента, я помещаю данные в TModule.TOModule (данные TStringList создается в Create'e класса)
потом выполняю TModule.readmsg;
в readmsg в библиотеке происходит так:
создается TThread
который имеет в себе свойство Data:TStringList;
Оно создается и в него пихается содержимое Tmodule.ToModule
(data.text:=TModule.Tomodule.text)
и запускается поток с параметром FreeOnTerminate:=true;
в Execute выполеняется команда, которая указана в Data.strings[0]
..это в кратце, кстати обратное, т.е. из длл в основную прогу таким же образом работает, т.к. модулей может быть много.. а данные "общие".
все рулится очень не плохо...
единственная ошибка это при закрытии проги "RunTime 217"... читал о 216 ошибке, так что думаю что 217 что-то похожее...где-то я намутил что-то..
так вот попутные вопросы:
1) как такая реализация, оправдывает ли она себя или просто нагружает комп?
2) что следует окротекрировать исправить ...?
3) почему вылетает 217 ошибка
кстати там и там подключаю ShareMem..
заранее благодарен!
Digitman (2005-02-11 08:17:00) [10]
> это нормально и правильно? всмысле с памятью и скоростью?
>
> не лучше ли использовать PChar
если ты умудришься реализовать более эффективные методы перераспределения памяти, нежели методы используемые этим классом, то тогда может и есть резон использовать PChar
кстати, про единый менеджер памяти в случае передачи дин.структур между хост-приложением и ДЛЛ не забыл ?