![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Про процедуру и обработку событий [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]Помогите кто-нибудь, Я уже запарился совсем