Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / можно ли получить сам указатель на данные из ActiveX.IStream? / 20 сообщений из 20, страница 1 из 1
23.06.2018, 16:17
    #39664637
зонд
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
добрый день.
сразу к делу, в мою функцию передают IStream .
мне надо осуществить поиск определённых "маркеров" (последовательность 2 или 4 байт) и смещать position на найденные смещения.

проблема в том, что размер данных в потоке может быть довольно не маленьким - и хотелось бы обойтись без их копирования туда-сюда. будь это TMemoryStream всё было бы очевидно.
есть ли способы получить указатель на начало самих данных IStream? что-то не выходит найти, подскажите?
...
Рейтинг: 0 / 0
23.06.2018, 16:40
    #39664648
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
зонд,
нет, нельзя: интерфейс не предоставляет такой возможности.

Но "можно договориться". :)
Если ты точно знаешь природу своего источника данных, то источник может (например, в "хвост") добавлять нужное значение (тот самый адрес).
...
Рейтинг: 0 / 0
23.06.2018, 17:09
    #39664652
зонд
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
нет, "создатель и передаватель" этого IStream является неким внешним явлением.

вроде нарыл в MSDN мол пишут можно попробовать GlobalLock и GlobalUnlock, но сработает не во всех случаях. только я с ними не работал.
работаю на Делфи и на Java, и по возможности стараюсь использовать родной MemoryManagement соответственно или Делфи или Java.
считаю - а нафига в данной области делать мешанину с WinAPI? (возможно я не прав?)

сейчас попробуем... значится... пытаемся получить указатель через GlobalLock, а если не получилось - пока оставим заглушку в виде копирования в TMemoryStream...
гм.. ..странные у них Return и Remarks... и чё-та не понятно - GlobalLock блокирует вызовы GlobalReAlloc или нет? хотя ладно, не думаю что кто-то вздумает вызывать последнее.
...
Рейтинг: 0 / 0
23.06.2018, 17:31
    #39664660
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
зонд,

Источник данных - в другом адресном пространстве?
Если да - то адрес тебе не поможет.
...
Рейтинг: 0 / 0
23.06.2018, 17:51
    #39664666
зонд
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
хороший вопрос... чёт даже не задумывался... старею)

документация "внешнего явления" никак не комментирует данный разрез. как-то можно узнать вручную самостоятельно рантайм?
ну а если нет, то GlobalLock просто провалится же и всё, нет? на крайний случай будет работать копирование в TMemoryStream.

хотя... если ж мне грубо говоря надо перебрать все байты в потоке - может и нет смысла копировать, просто просто читать по байту из IStream.Read()? как ж будет разумнее?
но с указателем всяко бы быстрее было...
...
Рейтинг: 0 / 0
23.06.2018, 17:55
    #39664668
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
зонд,
ну что ты как маленький. Сделай "как-нибудь", если окажется медленно - тогда и начинай страдать.
...
Рейтинг: 0 / 0
23.06.2018, 17:57
    #39664669
Aniskin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
IStream в общем случае имеет абсолютно произвольную природу, и буфера вообще может и не быть, а данные могут читаться с диска/сети по запросу. И все эти опыты с GlobalLock приведут лишь к неожиданным AV. Как было уже отмечено, единственный правильный метод - договариваться с источником IStream. Но лучше договориться, что бы объект дополнительно реализовал какой нибудь интерфейс вида IGetStreamBuffer, который бы можно было бы запросить через QueryInterface. Лично я так делаю.
...
Рейтинг: 0 / 0
23.06.2018, 18:03
    #39664670
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
зондесли ж мне грубо говоря надо перебрать все байты в потоке - может и нет смысла копировать,
просто просто читать по байту из IStream.Read()? как ж будет разумнее?

Нет, так будет совершенно неразумнее. Лучше читать в буфер большими кусками, а потом уже
этот буфер парсить по байту конечным автоматом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.06.2018, 18:47
    #39664677
зонд
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
чччД__, в смысле? я же писал - сделано уже, через копирование в TMemoryStream. но хотелось бы обойтись без их копирования туда-сюда.
там от 40 до аж 900 мегабайт - мотылять туда-сюда довольно накладно, нет что ли? и да, сейчас явно медленее чем хотелось бы (и чем могло бы).

Aniskin, я знаю, просто документация "внешнего явления" никак не поясняет природу своего IStream. "договариваться" также не получится. as is. но за совет большое спасибо!
не понял тока почему GlobalLock должны приводить к AV? не найдёт - просто вернёт ошибку в GetLastError, разве не так? хотя я почти дописал новый код, скоро просто опробую что получается.

Dimitry Sibiryakov, само собою, пока вот вытягивается в TMemoryStream всё сразу. но именно от этого бы хотелось избавиться. а даже если средними кусками - не вижу возможности улучшения.

просто если окажется что есть возможность просто взять уже имеющийся указатель - будет явно оптимальнее.
...
Рейтинг: 0 / 0
23.06.2018, 18:58
    #39664680
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
зонда даже если средними кусками - не вижу возможности улучшения.

Ну не видишь, так не видишь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.06.2018, 19:03
    #39664681
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
зонд,

ну какой тут "указатель", если ты не знаешь ни природы входных данных, ни природы источника?

Ты же сам в теме явно обозначил: "ActiveX", это значит, что источник может быть где угодно, и в другом процессе и даже на другом компе. Что ты с таким указателем делать будешь?
...
Если медленно работает - определись, почему медленно, а там уже думай, что можно сделать. Может, поблочно читать, может - кэш из считанных блоков реализовать, может, следует подумать о совмещении обработки с загрузкой, может, ещё что.
Что ещё за задача у тебя: может, тебе и не нужен весь исходный массив.
...
Рейтинг: 0 / 0
23.06.2018, 20:10
    #39664702
зонд
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
Dimitry Sibiryakov,
   1) Я читаю весь поток целиком. Делаю поиск.
   2) Я читаю 25% потока. Делаю поиск. Я читаю 25% потока. Делаю поиск. Я читаю 25% потока. Делаю поиск. Я читаю 25% потока. Делаю поиск.
ну и где тут возможности для ускорения поиска ? :3
тока по памяти лучше, но память как раз в данном месте не принципиальна.

чччД__, если я не знаю "природ", то имеется лишь два варианта - либо есть указатель (данные в текущем процесе), либо нету указателя (данные где-то ещё).
или вы думаете GlobalLock станет мне давать указатель, если данные не в текущем процессе?
мне такое кажется сомнительным, полагаю ошибку вернёт и всё. а дал указатель - значит и данные тоже "у нас". но вообще да, явно там ничего не было сказано...

заранее неизвестно - весь нужен или не весь, зависит от данных, становится понятным только после самого поиска.
ладно, пойду пробовать по всякому.
...
Рейтинг: 0 / 0
23.06.2018, 21:04
    #39664712
Aniskin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
зонд,

Скажи, а где ты вычитал, что GlobalLock может применяться к чему либо кроме хендла, полученного вызовом GlobalAlloc или GlobalReAlloc?

не понял тока почему GlobalLock должны приводить к AV?

Пусть это будет не AV, а просто глюк. Технически ничто не мешает переданному тебе IStream по случайному совпадению быть равным существующему в системе хендлу. И ты получишь валидный указатель на не твои данные.
...
Рейтинг: 0 / 0
23.06.2018, 21:12
    #39664716
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
зондну и где тут возможности для ускорения поиска? :3

Искать можно параллельно с чтением.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.06.2018, 22:08
    #39664733
Мигалка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
зонд, второй способ в 1,6 раза быстрее.
...
Рейтинг: 0 / 0
24.06.2018, 10:29
    #39664786
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
Dimitry Sibiryakov,

или несколькими ядрами. распараллеливается обычно в 3 строки.
...
Рейтинг: 0 / 0
25.06.2018, 10:27
    #39665124
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
Stream он на то и Stream, чтобы скрывать под собой что угодно. Хоть генератор рандомных символов, и никакого буфера у него может и не быть.
А в чем проблема копирования? Если это из оперативки в оперативку, то процесс довольно быстрый.
...
Рейтинг: 0 / 0
25.06.2018, 14:35
    #39665368
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
Василий 2Если это из оперативки в оперативку, то процесс довольно быстрый.Если оперативки хватит

А вообще, если я правильно понимаю задачу
зондмне надо осуществить поиск определённых "маркеров" (последовательность 2 или 4 байт) и смещать position на найденные смещения.необходимости чтения всего стрима нет. Т.к. искомый маркер может оказаться в самом начале
...
Рейтинг: 0 / 0
25.06.2018, 18:39
    #39665517
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
_Vasilisk_Василий 2Если это из оперативки в оперативку, то процесс довольно быстрый.Если оперативки хватит
Никто ж и не говорит, что стрим целиком надо грузить. Копировать покусочно и там искать. Конечно, код будет уже не столь тривиальный - надо будет предусмотреть случай нахождения искомой последовательности на границе кусков.
...
Рейтинг: 0 / 0
25.06.2018, 19:13
    #39665535
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли получить сам указатель на данные из ActiveX.IStream?
Василий 2Никто ж и не говорит, что стрим целиком надо грузитьТак автор и говорит жезонд1) Я читаю весь поток целиком. Делаю поиск.
   2) Я читаю 25% потока. Делаю поиск. Я читаю 25% потока. Делаю поиск. Я читаю 25% потока. Делаю поиск. Я читаю 25% потока. Делаю поиск.
ну и где тут возможности для ускорения поиска ? :3
тока по памяти лучше, но память как раз в данном месте не принципиальна.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / можно ли получить сам указатель на данные из ActiveX.IStream? / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]