imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 22.05.2006, 18:10     # 1
lyuq
Member
 
Аватар для lyuq
 
Регистрация: 15.06.2003
Адрес: underneath it all
Пол: Male
Сообщения: 348

lyuq Молодецlyuq Молодецlyuq Молодец
Передача динамического массива из dll в приложение

Возник затык, так сказать, не могу сообразить как организовать передачу динамического массива из dll в приложение. Причем передача данных должна проходить в режиме реального времени, т.е. как только в массиве появляется новый элемент, он тут же толжен быть передан в приложение.

Забыл добавить, все пишется на Delphi.
__________________
Сердце раскололось на тысячи искр, разжигая огонь угасающих глаз, бесконечно смотрящих на холодный свет звезд, не знающих страсти, любви и печали.(c)я

Последний раз редактировалось lyuq; 22.05.2006 в 19:15.
lyuq вне форума  
Старый 22.05.2006, 18:29     # 2
Kvarx
Member
 
Регистрация: 26.09.2005
Адрес: Питер
Сообщения: 336

Kvarx Известность не заставит себя ждатьKvarx Известность не заставит себя ждать
Не имел особо дел с дллбками, но на лабах по осям, для передачи данных между процессами использовали Pipes (каналы).

Цитата:
Сообщение от lyug
в массиве появляется новый элемент, он тут же толжен быть передан в приложение
Процесс, осуществляющий попытку чтения из пустого канала, будет приостановлен, пока там не появятся данные.

Если заинтересовался, то смотри в MSDN: CreatePipe, ReadFile, WriteFile.
Kvarx вне форума  
Старый 22.05.2006, 20:04     # 3
Gunslinger
Advanced Member
 
Аватар для Gunslinger
 
Регистрация: 15.09.2004
Адрес: Украина, Хмельницкий
Сообщения: 403

Gunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собой
Цитата:
Kvarx:
Если заинтересовался, то смотри в MSDN: CreatePipe, ReadFile, WriteFile.
Так как человек пишет на Delphi, MSDN навряд поможет.

А так сообствено говоря Pipes в .нете решают такие задачи, также можно передавать по tcp-каналам. Наверняка в дельфи что-то подобное должно быть
__________________
The man in black fled across the desert, and the Gunslinger followed. (c) S.King
Gunslinger вне форума  
Старый 22.05.2006, 23:31     # 4
lyuq
Member
 
Аватар для lyuq
 
Регистрация: 15.06.2003
Адрес: underneath it all
Пол: Male
Сообщения: 348

lyuq Молодецlyuq Молодецlyuq Молодец
Kvarx, Gunslinger - пасиб.

Тогда еще такой вопрос, с какой скоростью просходит обращение к каналам? Новые элементы в массиве могут появляться со скоростью до 50 шт/с, соответственно суммарное (запись + чтение) время обращения в каналу должно быть меньше 20 мс.

З.Ы. Kvarx, у меня ник lyuq, последняя q, а не g.
__________________
Сердце раскололось на тысячи искр, разжигая огонь угасающих глаз, бесконечно смотрящих на холодный свет звезд, не знающих страсти, любви и печали.(c)я

Последний раз редактировалось lyuq; 22.05.2006 в 23:34.
lyuq вне форума  
Старый 23.05.2006, 16:57     # 5
MrSerg
Guest
 
Сообщения: n/a

Быстро из своей dll в приложение данные можно переслать так:

Приложение передает в dll адрес процедуры своего обработчика новых данных.
Как только dll получает новые данные, сразу вызывает обработчик приложения.
Параметрами обработчика может быть указатель на динамический массив, простого копирования данных внутри одного процесса вполне достаточно.

Если непонятно могу напасать небольшой пример программы.
 
Старый 24.05.2006, 11:25     # 6
lyuq
Member
 
Аватар для lyuq
 
Регистрация: 15.06.2003
Адрес: underneath it all
Пол: Male
Сообщения: 348

lyuq Молодецlyuq Молодецlyuq Молодец
MrSerg
Пасиб!
Напиши, plz, небольшой пример программы.
__________________
Сердце раскололось на тысячи искр, разжигая огонь угасающих глаз, бесконечно смотрящих на холодный свет звезд, не знающих страсти, любви и печали.(c)я
lyuq вне форума  
Старый 24.05.2006, 13:16     # 7
MrSerg
Guest
 
Сообщения: n/a

Небольшой пример:
Код:
// основная программа
// описание процедуры вашей dll
procedure initdll(adr : pointer); external 'mydll.dll' name 'initdll';

Type buf=array of byte;
       Tbuf=^buf;
Var  mybuf:array[0..1000] of byte;	

//  процедура обработчика
//  p- указатель на массив данных
//  len- длинна массива данных
procedure newdata(p:Tbuf;len:dword);
begin
if  IsBadReadPtr(p,len) then exit;
// обработка данных
For i:=1 to len do mybuf[i]:=p^[i];
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
// передача в dll адреса обработчика. 
Initdll(addr(newdata));

// конец основной программы


// программа dll 
library mydll;
uses SysUtils,windows;

Type Tbac= procedure newdata(p : pointer;len:dword);
Var  bac:tbac=nil;
     Buf:array[0..1000] of byte;	

// сдесь ваша dll получает адрес procedure newdata
Procedure Initdll(adr : pointer);
Begin
// инициализация 
bac:=adr;
End;

…
…
// где то здесь вы получаете новые данные
// и если  инициализация была передаете данные
if addr(bac)<>nil then bac(@buf,length(buf));
…
…

Exports
Initdll;

Begin
End.
 

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 00:35.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.