Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-46490
VID
2002-03-07 00:12
2002.04.15
ДРОВА


1-46304
Locked
2002-03-30 08:15
2002.04.15
как перевести string в widestring?


3-46242
ava
2002-03-25 00:03
2002.04.15
SQL вопрос


1-46418
Nestor
2002-04-02 18:04
2002.04.15
InstallShield


1-46376
sammy
2002-04-01 08:09
2002.04.15
com файлы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский