Форум: "Основная";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
ВнизНужен совет по проектированию компонент Найти похожие ветки
← →
dymka (2002-04-03 08:06) [0]Определение уровня абстракций: Пишу 2 компонента для обмена файлами (для p2p)... Один условно назовем его TFileServer является наследником TidTCPServer, что обуславливает его многопоточность итп... Клиента тоже хотел сделать многопоточным, т.е. обеспечить пример разных файлов с разных хостов. TidTCPClient тут не подходит, поступил так: создал свой компонент на базе TComponent, в приват методе объявил список TList для хранения очередей закачки (одна очередь представляет из себя объект-наследник TPersistent)... каждый элемент очереди имеет у себя объект-наследник TThread... тобишь элемент очереди может запускать или останаливать поток... сам TThread уже содержит в себе компонент TidTCPClient...
Проблема в следующем - как правильно передавать данные от родителя TFileClient в поток, и самое главное - как передавать текущее состояние обратно родителю... через конструктор передавать Owner??? Или вообще поменять структуру объектов???
Выскажите свои мнения плиззз...
Исходники могу выслать... или выложить куда...
← →
dymka (2002-04-03 11:10) [1]поднимаю мессагу наверх :)
← →
yaJohn (2002-04-03 11:31) [2]Имхо в данном случае не TList, a TCollection. А еще лучше - TOwnedCollection
Данные от родителя - видимо усыпляем триаду, передаем данные в промежуточный буфер (создается и управляется триадой), будим триаду, которая проверяет наличие данных в буфере и коли таковые есть - отправляет.
Даббые из потока - через Owner. В случае с TCollection каждый итем знает свою коллекцию.
Но есть альтернативный вариант. Я в свое время, дабы избежать мудоханий с созданием и инициализацией сокетов в рантайме поместил сокет на новую форму TItemForm(пойдет и DataModule), как белый человек назначил все обработчики и свойства. А потом TItemForm юзал как итем. Кстати, списком итемов служил TListBox. Заодно и список потоков перед глазами. Имхо так проще.
← →
dymka (2002-04-03 13:56) [3]Второй вариант не подходит, т.к. хочу сделать независимый компонент...
Далее, насчет коллекции - коллекция нужна для визуального проектирования свойств, здесь это ни к чему.
Нужно 2 метода - поставить в очередь и грохнуть элемент.
Для элемента - приостановить и возобновить.
Сейчас делаю по аналогии с коллекциями, но через TList, т.е.
в конструкторе передаю владельца, и с потоком таже фишка.
Тока муторно как-то выходит... но возможно другого выхода и нет.
Что такое триада - без понятия... :(
← →
yaJohn (2002-04-03 14:19) [4]триада == TThread, пардон за слэнг. Зачем делать по аналогии с коллекцией, если уже есть коллекция?
>коллекция нужна для визуального проектирования свойств
А вот тут не соглашусь. Для хранения обьектов одного типа. Что и имеем в нашем случае. В коллекции уже реализована масса полезной функциональности. В данном случае она подходит идеально.
← →
Romkin (2002-04-03 15:10) [5]Коллекция подходит великолепно
А насчет передачи сообщений - можно просто создавать в TFileClient окно, передавать его handle потокам и пусть они пишут туда сообщения. TThread так и делает, см ThreadWindow, ThreadWndProc (classes)
Если через мессаги неудобно - используй список или коллекцию
А от родителя - просто через итемы, а там уже в процедуре потока смотри, есть ли событие в списке
← →
dymka (2002-04-03 16:01) [6]С этим буду разбираться...
Еще вопрос - как лучше вызвать конструктор потока для передачи начальных данных в него?
можно просто
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 16:28) [7]Первый способ гораздо лучше, не придется потом список параметров менять, можно и просто создать несколько конструкторов одновременно, кто мешает?
← →
yaJohn (2002-04-03 17:22) [8]Вопрос стиля и личного вкуса. Я обычно делаю стандартный Create(AOwner), а если хочу провести начальную инициализацию - делаю Init(PeerHost: string; PeerPort: integer; RemoteFileName. LocalFileName: string ну итп... (Светлая память трубо-поскакалю. Аминь).
← →
dymka (2002-04-03 17:30) [9]хм.. в принципе это идея... никто ж не запрещает не запускать поток в конструкторе... хотя в этом случае я всетаки перейду
на передачу параметра-записи без явного владения...
Это позволит использовать объект потока независимо от других классов... и эту же структуру или другую, но подобную передавать в PostMessage...
чтоб я без вас делал... спасибо!
Нащет коллекций не решил... не вижу проблем обойтись TList"ом...
хотя дальше время покажет...
Будут еще идеи - буду только рад...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c