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

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

Про процедуру и обработку событий [D5, Win2k]


hacker ©   (2002-01-04 10:11:00) 

Проблема такая:создаю динамически объект в процедуре и нужно в ней же использовать труды события этого объекта, а оно возникает, после выхода из процедуры. Получается, что оно возникает после того как мне понадобилось, к тому же объекта вроде как и нет.

Может его типа в отдельный поток запихать или что-то в этом роде?
Кто-нибудь решал такие проблемы?


NailS   (2002-01-09 11:48:00) [1]

TClientSocket описан в модуле ScktComp.pas,
а этот модуль использует Forms (implementation uses Forms, Consts;)
TClientSocket содержит поле FClientSocket: TClientWinSocket;
а TClientWinSocketнаследник от TCustomWinSocket, а TCustomWinSocket даже обращается к Application.HandleException(Self);
Вот вроде и все.


Hacker   (2002-01-09 11:36:00) [2]

Ладно - пересмотрю архитектуру под marat_from_tomsk ©
, но NailS ©, с чего ты взял что
"Если используется TClientSocket, тогда используется Forms...".
Если он VC - это не мешает обычно использовать его как не VC. И это вроде получается не проблема.

2) А что это за "классическая задача о читателе и писателе", я еще о ней не смышал(точнее про потоки я знаю проблемы в виде теории). Расскажите..


Builder   (2002-01-08 15:33:00) [3]

По тому, как хочет Hacker © (04.01.02 20:27) получается, что программа, которая вызовет библиотеку будет висеть и ждать, пока та будет что-то доставать из инета.
Выглядит не хорошо.
marat_from_tomsk © (08.01.02 05:40) Предлагает классическое правильное решение


NailS   (2002-01-08 13:13:00) [4]

По-проблеме один
Если используется TClientSocket, тогда используется Forms,
если используется Forms используется TApplication. Вроде проблема решилась.

Информация к размышлению
Был реализован компонент доступа к данным на базе длл.
Очень похоже на то, что предложил marat_from_tomsk ©
Экспортируется 4 функции
1. Инициализация соединения
2. Запрос на получение данных
3. Проверка готовности данных (приложение забирает данные из длл)
4. Завершение работы с длл.


marat_from_tomsk   (2002-01-08 05:40:00) [5]

в твоей dll
должна быть
1. функция инициализации
в которой создается сокет, вешаются обработчики и т.д.
2. собирание данных
3. взять собранную информацию
и к тому же все желательно делать с учетом того
что процессов несколько
то есть необходимо использовать блокировки (крит. секции)
классическая задача о читателе и писателе


Hacker   (2002-01-06 21:12:00) [6]

Кто знает - HELLLPPP!!!! MEEEEEE!!!!!


Hacker   (2002-01-04 20:27:00) [7]

Как NailS сказал это хорошо (для текущего положения моего проекта), но все будет так - не моя прога запускает мою процедуру, которая сидит в DLL, и ждет ответа ввиде буфера. Моя процедура должна закачать что требуют из инета, и отдать скачанное этой проге. Для этого мне надо создать TClientSocket, как-то получить данные из ее события и отдать в буфер.
Проблемы: 1) Там не будет TApplication , поэтому вариант NailS вроде не подходит
2) нужно создать объект и обработать его событие, и отдать то что насобирал обратно как результат вызываемой функции.
Вот как это вообще можно реализовать - создать объект в новом потоке??? - пока работаю в этом направлении, но не получается


Builder   (2002-01-04 15:41:00) [8]

Сорри, не очень понял. Но тогда я согласен с NailS © - стоит ли все бросать в обну и туже процедуру?


Hacker   (2002-01-04 15:23:00) [9]

Builder, этим мы только зададим обработчик(это у меня прописано),
дело в том, что он вызывается(происходит событие) когда я сказал,
Я не понял, ты мне предлогаешь ее самому MyRead вызывать, а смысл, я данные от сокета хочу получить


Builder   (2002-01-04 13:53:00) [10]

А не нужно ли присвоить TSocketClient.OnRead := MyRead, которая уже и будет читать и делать то, что нужно - ведь ее ты опишешь...


NailS   (2002-01-04 12:27:00) [11]

Пересмотреть архитектуру приложения
или твой сокет сделать глобальной переменной
или цикл в теле процедуры, чтобы из нее не выходить пока не получены данные.
while not DataRecieve do
Application.ProcessMessages;

Обработчик OnDataRecieve
...
DataRecieve := True;
...


hacker   (2002-01-04 11:50:00) [12]

Типа вот что: есть процедура, в ней создаю TSocketClient динамически (потому, что в DLL) у которого есть событие OnRead в котором приходят данные, НАДО получить эти данные и обработать в этой процедуре, а как их получить, если событие возникает только после выхода из этой процедуры...
Вот...
Что делать???!!!


panov   (2002-01-04 11:28:00) [13]

Так непонятно, что ты хочешь.


hacker   (2002-01-04 11:26:00) [14]

Помогите кто-нибудь, Я уже запарился совсем


Наверх

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