Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
Вниз100 раз...передача данных в DLL Найти похожие ветки
← →
Bes © (2005-02-11 01:12) [0]Мастера!
Есть серверная часть к которой могут подлючаться плагины (DLL)
так вот... мне надо обеспечить устойчивую связь между плагинами и осн. прогой.
я передаю указатель на класс TStringList
объект создаю в основной программе и туда сюда его гоняю...
это нормально и правильно? всмысле с памятью и скоростью?
не лучше ли использовать PChar
← →
Digitman © (2005-02-11 08:17) [1]
> это нормально и правильно? всмысле с памятью и скоростью?
>
> не лучше ли использовать PChar
если ты умудришься реализовать более эффективные методы перераспределения памяти, нежели методы используемые этим классом, то тогда может и есть резон использовать PChar
кстати, про единый менеджер памяти в случае передачи дин.структур между хост-приложением и ДЛЛ не забыл ?
← →
Bes © (2005-02-11 14:28) [2]у меня два вопроса
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 14:44) [3]ох и нахреновертил ты ... и в стратегии , и в коде ее реализующем ..
даже не знаю с чего начать "бомбить" тебя за это безобразие ...
> 1) а сам класс TStringList рационально ли распеделяет память,
> т.е. потрошить его надо или нет?
вполне рационально.
не представляю, как ты вознамерился его "потрошить" и что под этим подразумевается ..
> 2) не очень понял насчет единого менеджера памяти
тогда бросай свои "серверы" и "плагины" и штудируй теорию ..
в части того как Борланд реализует распределение/перераспределение/освобождение памяти, используемой в программах под его управлением ..
> destructor Free;
что еще за Free ?
TObject уже имеет метод класса Free, имеющий строго определенное назначение
> при закрытии проги "RunTime 217"... читал о 216 ошибке,
> так что думаю что 217 что-то похожее...где-то я намутил
> что-то..
> 3) почему вылетает 217 ошибка
про встроенный в Делфи отладчик и пошаговую трассировку кода слышал что-нибудь ?
← →
Bes © (2005-02-11 14:55) [4]тогда где почитать "про единый менеджер памяти",
а насчет Free... ну мне же надо мои TStringListы убить или как?
трасировку делал.. вылетает при FreeLibrary
← →
Digitman © (2005-02-11 15:04) [5]
> насчет Free
метод Free есть метод класса TObject, в ходе исполнения которого вызывается вирт.метод-деструктор объекта-наследника класса TObject ...
в дан.случае наследником класса TObject (прямым) у тебя является тыой класс TModuleClass, поэтому все что от тебя требовалось - объявить и реализовать в своем классе
destructor Destroy; override;
в теле перекрытого Destroy-метода ты вправе освободить все ресурсы, занятые твоим классом в ходе его конструирования и работы его методов
SomeObject.Free делает следующее :
- проверяется, не nil-ли SomeObject;
- если не nil, то вызывается его метод-деструктор Destroy, если ты его перекрыл, а если не перекрыл, то метод-деструктор Destroy предка
← →
Bes © (2005-02-11 15:11) [6]интересно а если в
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:33) [7]
интересно а если
эксперименты должны быть ОСОЗНАННЫМИ !
TModuleClass=class
..
public
destructor Destroy; override;
end;
destructor TModuleClass.Destroy;
begin
ToModule.Free;
FromModule.Free;
inherited;
end;
> передоваемые
русский язык в школе учил или нет ?
для проверки правописания гласной в корне слова следует подобрать однокоренное слово, где сомнительная гласная имеет ударение ..
вот так хотя бы :
передАча
!!
это уже не очепятка, глаз это режет ..
← →
Eraser © (2005-02-11 18:51) [8]Bes ©
кстати там и там подключаю ShareMem..
Кстати, если в дальнейшем планируется переписывать сервер на MSVC++, то эти плагины работать не будут.
← →
Bes © (2005-02-11 19:12) [9]не плАнируется
← →
Eraser © (2005-02-11 19:27) [10]Bes ©
И правильно ))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.044 c