Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование NamedPipes, NamedPipes без создания доп.потоков 
V
    Опции темы
kami
Дата 10.5.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Есть приложение, работающее под Vista в текущей WinSta и на активном десктопе, устанавливающее глобальный хук.
Хук, само собой, в dll.
Результаты работы хука передаются в приложение.
Данных по объему за 1 передачу мало, вполне хватило бы и PostMessage, если бы не особенности работы очереди сообщений в Vista (см. описание hWnd параметра).

По совету попробовал задействовать NamedPipes, само собой - воспользовавшись готовыми компонентами, ибо плодить велосипеды неохота.
Пробовал: Pipes от rllibby; CiaPipes от не_помню_кого, пример Игоря Шевченко, который так и не смог адаптировать под свои нужды :(
В результате столкнулся со следующими проблемами:
1. Эти компоненты нормально работают, если создаются из основного потока VCL-приложения и отвратно, если из доп.потока. Отвратность не поддается описанию, когда работа производится в хуке в контексте другого приложения. Заключается отвратность в том, что создание и передача данных производятся нормально, но при завершении работы приложения, установившего хук, внутри Pipe-компонентов происходит замораживание на Wait-функциях (ждет SetEvent). Причем - даже при завершении в штатном режиме.
"Хукнутые" приложения в результате этого просто зависают.
Попытки разобраться в коде ни к чему хорошему не привели - я слабо понимаю работу ф-и SetEvent, а в этих компонентах вся синхронизация построена именно на ней. Менять ее на более мне привычные CriticalSections - это переписывать весь код.

2. Работа этих компонентов и примера Игоря Шевченко основана на создании для каждого подключения дополнительного потока, что в условиях моей задачи весьма расточительно, т.к. подключений будет куча.

Проблема 1 частично решена использованием вместо PipeClient обычного TFileStream.
Осталась проблема №2 и частично №1 в плане использовани PipeServer.

Собственно - вопрос:
возможна ли реализация PipeServer без создания для каждого подключения дополнительного потока?
В крайнем случае - реализация PipeServer, которая по Вашему мнению не имеет проблем с синхронизацией.

P.S. C удовольствием бы воспользовался для передачи данных из хука в свое приложение сокетами (моя родная стихия), но пользователя инфаркт хватит, когда файрволл сообщит, что "Notepad пытается получить доступ к сети" smile
PM MAIL WWW   Вверх
Демо
Дата 10.5.2009, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



kami

Код не можешь прикрепить для тестирования?
Может удастся подумать...


--------------------
    
PM MAIL ICQ Skype   Вверх
kami
Дата 10.5.2009, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Демо @  10.5.2009,  23:52 Найти цитируемый пост)
Код не можешь прикрепить для тестирования?

Попробую минимизировать, бо там столько всего...
А просто форму с брошенными на нее компонентами не получится, ибо 
Цитата(kami @  10.5.2009,  23:31 Найти цитируемый пост)
Эти компоненты нормально работают, если создаются из основного потока VCL-приложения

Попробую. Как получится - скину код.
PM MAIL WWW   Вверх
Демо
Дата 10.5.2009, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(kami @  10.5.2009,  23:54 Найти цитируемый пост)
Попробую. Как получится - скину код. 


Хорошо.

Добавлено через 6 минут и 23 секунды
kami
Сорри, я и забыл, что уже на Windows7 перешел с Висты... Хотя может и под семёркой то же самое будет.


--------------------
    
PM MAIL ICQ Skype   Вверх
kami
Дата 11.5.2009, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Демо @  10.5.2009,  23:55 Найти цитируемый пост)
Сорри, я и забыл, что уже на Windows7 перешел с Висты... Хотя может и под семёркой то же самое будет

А на самом деле без разницы.
Особенности поведения PostMessage начались с Висты и будут продолжаться дальше.
А вот особенности поведения компонентов, реализующих функционал NamedPipes от операционки не зависят, если она >=W2k.

код во вложении, сразу с использованными компонентами.

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  PIPES.zip 35,12 Kb
PM MAIL WWW   Вверх
dumb
Дата 11.5.2009, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



эм, может проще mmf?
PM MAIL   Вверх
kami
Дата 11.5.2009, 03:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



dumb
Каким образом, если нужен принцип:
много источников данных сообщают их одному приемнику. Постоянно.
Данные должны передаваться практически мгновенно. Обратная связь не нужна.

Если покажете, как с помощью mmf можно организовать стек FIFO или что-нибудь в этом роде - буду только рад, т.к. моих скромных знаний хватит только на добавление данных в конец mmf. А вот как их убрать из начала, чтобы файл подкачки не распухал - не знаю.
PM MAIL WWW   Вверх
dumb
Дата 11.5.2009, 04:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(kami @  11.5.2009,  03:35 Найти цитируемый пост)
т.к. моих скромных знаний хватит только на добавление данных в конец mmf
мне так показалось, что этого вполне достаточно. хотя может я не до конца вник в суть.

Цитата(kami @  11.5.2009,  03:35 Найти цитируемый пост)
А вот как их убрать из начала, чтобы файл подкачки не распухал - не знаю.
а разве необходимо убирать по одному? - почему нельзя вычитать все и "обнулить"?

PM MAIL   Вверх
kami
Дата 11.5.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(dumb @  11.5.2009,  04:30 Найти цитируемый пост)
мне так показалось, что этого вполне достаточно. хотя может я не до конца вник в суть.

Тогда я чего-то не понимаю.
mmf, afaik создается конкретного размера:
Код

CreateFileMapping(INVALID_HANDLE_VALUE, @sa, PAGE_READWRITE, 0, xxx, @Name[1]);

Допустим, создаем с запасом (хотя - с каким, не понимаю), в начало я добавлю количество структур данных.
т.е. получится что-то вроде
THookStruct=record
  StructCount:integer;
  StructItems:array of TRect;
end;

следующий момент:
нужно добавить очередную запись в конец из хука.
считываем количество записей, в этот момент планировщик потоков отдает управление моей программе, которая обнуляет все имеющееся в mmf.
Управление переключается обратно в хук, который увеличивает на 1 количество записей (которых на самом деле уже не n, а 0) и добавляет данные в конец mmf.
В результате - значимой будет только последняя запись, а остальное - пустышки. И это в лучшем случае, если управление будет передаваться на границах операторов, а не "посредине" их.

Что я не так понимаю?
PM MAIL WWW   Вверх
dumb
Дата 11.5.2009, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(kami @  11.5.2009,  13:52 Найти цитируемый пост)
Допустим, создаем с запасом (хотя - с каким, не понимаю)
по-хорошему, прикинуть скорость поступления событий и частоту их выборки, и сделать c x-кратным запасом. если не париться, то сделать 1мб и все. smile

Цитата(kami @  11.5.2009,  13:52 Найти цитируемый пост)
Что я не так понимаю?
эм... я полагал, что блокировка доступа к общему ресурсу(mmf) при много-поточной работе - это очевидное. прошу пардона. smile

блокировка схематично:
Код

ReceiverInit:
  hMutex := CreateMutex(@sa, false, 'some_uniq_string');
ReceiverClose:
  CloseHandle(hMutex);

SenderInit(hook dll entry - DLL_PROCESS_ATTACH):
  hMtx := OpenMutex(SYNCHRONIZE, false, 'some_uniq_string'); 
SenderClose(hook dll entry - DLL_PROCESS_DETACH):
  CloseHandle(hMtx);

Sender:
  if WaitForSingleObject(hMtx, 5000) <> WAIT_OBJECT_0 then error/exit
  // здесь мы владеем mutex'ом, все остальные потоки пришедшие в WaitForSingleObject(hMtx будут ждать освобождения
  пишем данные, увеличиваем счетчики итд
  ReleaseMutex(hMtx);

Receiver:
  if WaitForSingleObject(hMutex, 5000) <> WAIT_OBJECT_0 then error/exit
  вычитываем данные, обнуляем итд
  ReleaseMutex(hMutex);

PM MAIL   Вверх
kami
Дата 11.5.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(dumb @  11.5.2009,  21:01 Найти цитируемый пост)
я полагал, что блокировка доступа к общему ресурсу(mmf) при много-поточной работе - это очевидное.

/me сгорает_от_стыда_за_свою_глупость.

Попробую, отпишусь. Скорее всего, так и сделаю.

Единственное, что остается, и что действительно "парит" - 
Цитата(dumb @  11.5.2009,  21:01 Найти цитируемый пост)
если не париться, то сделать 1мб и все.

В принципе - 
SizeOf(TRect)=16b, 
1Mb/16b=65536 записей.
Ххххххто его знает - много это или мало smile

P.S. все-таки, хотелось хоть немного разобраться с NamedPipes, можно ли сделать реализацию Pipe server -а однопоточным smile
PM MAIL WWW   Вверх
kami
Дата 12.5.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Чтобы долго не держать тему открытой (лучше потом еще создам), закроем ее.
По совету dumb, будет следующая реализация:
при внедрении dll в процесс будет создаваться доп.поток, который будет разруливать обмен по mmf (чтобы, в соответствии с рекомендациями MSDN, не задерживать на ф-и хука). Передача внутрь доп.потока будет идти по PostThreadMessage, что лучше всего соответствует изначальным требованиям и минимизации времени выполнения хука.
Дальше - действительно "по дефолту", как и описал dumb.

Всем спасибо.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1023 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.