Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужен совет по проектированию компонент [D6, Win2k]


dymka ©   (2002-04-03 08:06:00) 

Определение уровня абстракций: Пишу 2 компонента для обмена файлами (для p2p)... Один условно назовем его TFileServer является наследником TidTCPServer, что обуславливает его многопоточность итп... Клиента тоже хотел сделать многопоточным, т.е. обеспечить пример разных файлов с разных хостов. TidTCPClient тут не подходит, поступил так: создал свой компонент на базе TComponent, в приват методе объявил список TList для хранения очередей закачки (одна очередь представляет из себя объект-наследник TPersistent)... каждый элемент очереди имеет у себя объект-наследник TThread... тобишь элемент очереди может запускать или останаливать поток... сам TThread уже содержит в себе компонент TidTCPClient...
Проблема в следующем - как правильно передавать данные от родителя TFileClient в поток, и самое главное - как передавать текущее состояние обратно родителю... через конструктор передавать Owner??? Или вообще поменять структуру объектов???
Выскажите свои мнения плиззз...
Исходники могу выслать... или выложить куда...


dymka   (2002-04-03 17:30:00) [1]

хм.. в принципе это идея... никто ж не запрещает не запускать поток в конструкторе... хотя в этом случае я всетаки перейду
на передачу параметра-записи без явного владения...
Это позволит использовать объект потока независимо от других классов... и эту же структуру или другую, но подобную передавать в PostMessage...
чтоб я без вас делал... спасибо!
Нащет коллекций не решил... не вижу проблем обойтись TList"ом...
хотя дальше время покажет...
Будут еще идеи - буду только рад...


yaJohn   (2002-04-03 17:22:00) [2]

Вопрос стиля и личного вкуса. Я обычно делаю стандартный Create(AOwner), а если хочу провести начальную инициализацию - делаю Init(PeerHost: string; PeerPort: integer; RemoteFileName. LocalFileName: string ну итп... (Светлая память трубо-поскакалю. Аминь).


Romkin   (2002-04-03 16:28:00) [3]

Первый способ гораздо лучше, не придется потом список параметров менять, можно и просто создать несколько конструкторов одновременно, кто мешает?


dymka   (2002-04-03 16:01:00) [4]

С этим буду разбираться...
Еще вопрос - как лучше вызвать конструктор потока для передачи начальных данных в него?
можно просто
Thread := TMyThread.Create(Self);
и в
procedure TMyThread.Create(AOwner: TObject);
begin
FOwner: AOwner;

end;
тогда все необходимые даннее будут можно вытащить через свойства родителей.

или сделать конструктор типа
Create(PeerHost: string; PeerPort: integer; RemoteFileName. LocalFileName: string ну итп... т.е. использовать список параметров... для наглядности можно запихнуть их в record???

не знаю как грамотнее поступить... в первом вроде как не нужно менять описание конструктора при изменении набора параметров,
а также запускать поток отдельно... хотя это может показаться лишним..


Romkin   (2002-04-03 15:10:00) [5]

Коллекция подходит великолепно
А насчет передачи сообщений - можно просто создавать в TFileClient окно, передавать его handle потокам и пусть они пишут туда сообщения. TThread так и делает, см ThreadWindow, ThreadWndProc (classes)
Если через мессаги неудобно - используй список или коллекцию
А от родителя - просто через итемы, а там уже в процедуре потока смотри, есть ли событие в списке


yaJohn   (2002-04-03 14:19:00) [6]

триада == TThread, пардон за слэнг. Зачем делать по аналогии с коллекцией, если уже есть коллекция?

>коллекция нужна для визуального проектирования свойств
А вот тут не соглашусь. Для хранения обьектов одного типа. Что и имеем в нашем случае. В коллекции уже реализована масса полезной функциональности. В данном случае она подходит идеально.


dymka   (2002-04-03 13:56:00) [7]

Второй вариант не подходит, т.к. хочу сделать независимый компонент...
Далее, насчет коллекции - коллекция нужна для визуального проектирования свойств, здесь это ни к чему.
Нужно 2 метода - поставить в очередь и грохнуть элемент.
Для элемента - приостановить и возобновить.
Сейчас делаю по аналогии с коллекциями, но через TList, т.е.
в конструкторе передаю владельца, и с потоком таже фишка.
Тока муторно как-то выходит... но возможно другого выхода и нет.
Что такое триада - без понятия... :(


yaJohn   (2002-04-03 11:31:00) [8]

Имхо в данном случае не TList, a TCollection. А еще лучше - TOwnedCollection
Данные от родителя - видимо усыпляем триаду, передаем данные в промежуточный буфер (создается и управляется триадой), будим триаду, которая проверяет наличие данных в буфере и коли таковые есть - отправляет.
Даббые из потока - через Owner. В случае с TCollection каждый итем знает свою коллекцию.

Но есть альтернативный вариант. Я в свое время, дабы избежать мудоханий с созданием и инициализацией сокетов в рантайме поместил сокет на новую форму TItemForm(пойдет и DataModule), как белый человек назначил все обработчики и свойства. А потом TItemForm юзал как итем. Кстати, списком итемов служил TListBox. Заодно и список потоков перед глазами. Имхо так проще.


dymka   (2002-04-03 11:10:00) [9]

поднимаю мессагу наверх :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо