Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Вниз

Про процедуру и обработку событий 


hacker   (2002-01-04 10:11) [0]

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

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



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

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



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

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



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

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



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

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

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



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

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



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

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



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

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



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

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



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

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



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

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



NailS   (2002-01-08 13:13) [11]

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

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



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

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



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

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

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



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

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




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.022 c
1-90266           Dreamer               2002-01-09 22:19  2002.01.28  
Нужно ниспадающее окошко с хелпом при зависании над каким-либо обьектом,


1-90285           Igorok                2002-01-08 12:44  2002.01.28  
Мерцание в ListView ?


1-90298           Vacheslav             2002-01-09 19:49  2002.01.28  
Подскажите, в чем ошибка: задаю цикл


3-90224           EternalWonderer       2001-12-24 17:20  2002.01.28  
Проблема с count(*) в joined запросе


4-90406           vov1                  2001-11-24 10:59  2002.01.28  
ToolBar