|
|
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
добрый день. сразу к делу, в мою функцию передают IStream . мне надо осуществить поиск определённых "маркеров" (последовательность 2 или 4 байт) и смещать position на найденные смещения. проблема в том, что размер данных в потоке может быть довольно не маленьким - и хотелось бы обойтись без их копирования туда-сюда. будь это TMemoryStream всё было бы очевидно. есть ли способы получить указатель на начало самих данных IStream? что-то не выходит найти, подскажите? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 16:17 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
зонд, нет, нельзя: интерфейс не предоставляет такой возможности. Но "можно договориться". :) Если ты точно знаешь природу своего источника данных, то источник может (например, в "хвост") добавлять нужное значение (тот самый адрес). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 16:40 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
нет, "создатель и передаватель" этого IStream является неким внешним явлением. вроде нарыл в MSDN мол пишут можно попробовать GlobalLock и GlobalUnlock, но сработает не во всех случаях. только я с ними не работал. работаю на Делфи и на Java, и по возможности стараюсь использовать родной MemoryManagement соответственно или Делфи или Java. считаю - а нафига в данной области делать мешанину с WinAPI? (возможно я не прав?) сейчас попробуем... значится... пытаемся получить указатель через GlobalLock, а если не получилось - пока оставим заглушку в виде копирования в TMemoryStream... гм.. ..странные у них Return и Remarks... и чё-та не понятно - GlobalLock блокирует вызовы GlobalReAlloc или нет? хотя ладно, не думаю что кто-то вздумает вызывать последнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 17:09 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
зонд, Источник данных - в другом адресном пространстве? Если да - то адрес тебе не поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 17:31 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
хороший вопрос... чёт даже не задумывался... старею) документация "внешнего явления" никак не комментирует данный разрез. как-то можно узнать вручную самостоятельно рантайм? ну а если нет, то GlobalLock просто провалится же и всё, нет? на крайний случай будет работать копирование в TMemoryStream. хотя... если ж мне грубо говоря надо перебрать все байты в потоке - может и нет смысла копировать, просто просто читать по байту из IStream.Read()? как ж будет разумнее? но с указателем всяко бы быстрее было... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 17:51 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
зонд, ну что ты как маленький. Сделай "как-нибудь", если окажется медленно - тогда и начинай страдать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 17:55 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
IStream в общем случае имеет абсолютно произвольную природу, и буфера вообще может и не быть, а данные могут читаться с диска/сети по запросу. И все эти опыты с GlobalLock приведут лишь к неожиданным AV. Как было уже отмечено, единственный правильный метод - договариваться с источником IStream. Но лучше договориться, что бы объект дополнительно реализовал какой нибудь интерфейс вида IGetStreamBuffer, который бы можно было бы запросить через QueryInterface. Лично я так делаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 17:57 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
зондесли ж мне грубо говоря надо перебрать все байты в потоке - может и нет смысла копировать, просто просто читать по байту из IStream.Read()? как ж будет разумнее? Нет, так будет совершенно неразумнее. Лучше читать в буфер большими кусками, а потом уже этот буфер парсить по байту конечным автоматом. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 18:03 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
чччД__, в смысле? я же писал - сделано уже, через копирование в TMemoryStream. но хотелось бы обойтись без их копирования туда-сюда. там от 40 до аж 900 мегабайт - мотылять туда-сюда довольно накладно, нет что ли? и да, сейчас явно медленее чем хотелось бы (и чем могло бы). Aniskin, я знаю, просто документация "внешнего явления" никак не поясняет природу своего IStream. "договариваться" также не получится. as is. но за совет большое спасибо! не понял тока почему GlobalLock должны приводить к AV? не найдёт - просто вернёт ошибку в GetLastError, разве не так? хотя я почти дописал новый код, скоро просто опробую что получается. Dimitry Sibiryakov, само собою, пока вот вытягивается в TMemoryStream всё сразу. но именно от этого бы хотелось избавиться. а даже если средними кусками - не вижу возможности улучшения. просто если окажется что есть возможность просто взять уже имеющийся указатель - будет явно оптимальнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 18:47 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
зонда даже если средними кусками - не вижу возможности улучшения. Ну не видишь, так не видишь. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 18:58 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
зонд, ну какой тут "указатель", если ты не знаешь ни природы входных данных, ни природы источника? Ты же сам в теме явно обозначил: "ActiveX", это значит, что источник может быть где угодно, и в другом процессе и даже на другом компе. Что ты с таким указателем делать будешь? ... Если медленно работает - определись, почему медленно, а там уже думай, что можно сделать. Может, поблочно читать, может - кэш из считанных блоков реализовать, может, следует подумать о совмещении обработки с загрузкой, может, ещё что. Что ещё за задача у тебя: может, тебе и не нужен весь исходный массив. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 19:03 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, 1) Я читаю весь поток целиком. Делаю поиск. 2) Я читаю 25% потока. Делаю поиск. Я читаю 25% потока. Делаю поиск. Я читаю 25% потока. Делаю поиск. Я читаю 25% потока. Делаю поиск. ну и где тут возможности для ускорения поиска ? :3 тока по памяти лучше, но память как раз в данном месте не принципиальна. чччД__, если я не знаю "природ", то имеется лишь два варианта - либо есть указатель (данные в текущем процесе), либо нету указателя (данные где-то ещё). или вы думаете GlobalLock станет мне давать указатель, если данные не в текущем процессе? мне такое кажется сомнительным, полагаю ошибку вернёт и всё. а дал указатель - значит и данные тоже "у нас". но вообще да, явно там ничего не было сказано... заранее неизвестно - весь нужен или не весь, зависит от данных, становится понятным только после самого поиска. ладно, пойду пробовать по всякому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 20:10 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
зонд, Скажи, а где ты вычитал, что GlobalLock может применяться к чему либо кроме хендла, полученного вызовом GlobalAlloc или GlobalReAlloc? не понял тока почему GlobalLock должны приводить к AV? Пусть это будет не AV, а просто глюк. Технически ничто не мешает переданному тебе IStream по случайному совпадению быть равным существующему в системе хендлу. И ты получишь валидный указатель на не твои данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 21:04 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
зондну и где тут возможности для ускорения поиска? :3 Искать можно параллельно с чтением. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 21:12 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
зонд, второй способ в 1,6 раза быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 22:08 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, или несколькими ядрами. распараллеливается обычно в 3 строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2018, 10:29 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
Stream он на то и Stream, чтобы скрывать под собой что угодно. Хоть генератор рандомных символов, и никакого буфера у него может и не быть. А в чем проблема копирования? Если это из оперативки в оперативку, то процесс довольно быстрый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2018, 10:27 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
Василий 2Если это из оперативки в оперативку, то процесс довольно быстрый.Если оперативки хватит А вообще, если я правильно понимаю задачу зондмне надо осуществить поиск определённых "маркеров" (последовательность 2 или 4 байт) и смещать position на найденные смещения.необходимости чтения всего стрима нет. Т.к. искомый маркер может оказаться в самом начале ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2018, 14:35 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Василий 2Если это из оперативки в оперативку, то процесс довольно быстрый.Если оперативки хватит Никто ж и не говорит, что стрим целиком надо грузить. Копировать покусочно и там искать. Конечно, код будет уже не столь тривиальный - надо будет предусмотреть случай нахождения искомой последовательности на границе кусков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2018, 18:39 |
|
||
|
можно ли получить сам указатель на данные из ActiveX.IStream?
|
|||
|---|---|---|---|
|
#18+
Василий 2Никто ж и не говорит, что стрим целиком надо грузитьТак автор и говорит жезонд1) Я читаю весь поток целиком. Делаю поиск. 2) Я читаю 25% потока. Делаю поиск. Я читаю 25% потока. Делаю поиск. Я читаю 25% потока. Делаю поиск. Я читаю 25% потока. Делаю поиск. ну и где тут возможности для ускорения поиска ? :3 тока по памяти лучше, но память как раз в данном месте не принципиальна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2018, 19:13 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39664648&tid=2040701]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
206ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 544ms |

| 0 / 0 |
