Конференция "Сети" » Как удалить динамически созданные ClientSocket при OnDisconnect?
 
  • Сергей (28.04.09 16:18) [0]
    Здравствуйте
    Помогите пожалуйста с моей проблемой.
    Я хочу при удаленном разрыве соединения (по событию) удалить динамически созданный объект компонента ClientSocket

    маленький поясняющий пример кода:

    глобальный var
    ClientSocket: TClientSocket;

    создаю
    ClientSocket:=TClientSocket.Create(Self);
    ClientSocket.Host := '127.0.0.1';
    ClientSocket.Port := 5000;
    ClientSocket.OnDisconnect=ClientSocketDisconnect;
    ClientSocket.Open;

    в процедуре ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket)
    хочу удалить ранее созданные ClientSocket - у меня ни как это не не удается сделать Free так как возникает ошибка 10038

    подскажите пожалуйста как мне это сделать?
  • Сергей М. © (28.04.09 17:42) [1]
    А кто такой Self ?
  • Сергей (28.04.09 17:52) [2]

    > А кто такой Self ?


    сорри - у меня это просто поверхность TComponent - для динамически созданных объектов

    ClientSocket:=TClientSocket.Create(NIL); - разницы нет
  • Сергей М. © (28.04.09 19:18) [3]

    > у меня это просто поверхность


    Ты русский понимаешь ?)

    Я не спрашиваю, кто или что у тебя там есть "поверхность".

    Я спрашиваю, что за объект у тебя фигурирует в кач-ве Self, коль скоро ты передаешь его фактическим параметром в конструктор класса TClientSocket..

    Или тебе фиолетово кто он такой ?)
  • Сергей (29.04.09 00:44) [4]
    Тезка я уже тебе ответил - там NIL !!!
  • Сергей М. © (29.04.09 10:27) [5]
    Я к тому, что если в приложении есть хотя бы одно окно - к примеру, окно формы - ему можно послать предопределенное асинхронное сообщение (PostMessage), при получении и обработке которого требуемый объект будет уничтожен.

    Вот и предположил, что Self у тебя ссылается на форму
  • Сергей (29.04.09 12:07) [6]
    у меня вообще нет ни одной формы - dll
    TClientSocket - создаются динамически для разных коннектов
    Но это в принципе не важно - так как в апликейшине на простейшем примере та же проблема....
    задача стоит удалить нужный при получении события о разрыве связи

    Вопрос остался открытым
  • Сергей М. © (29.04.09 12:23) [7]

    > у меня вообще нет ни одной формы - dll


    > Но это в принципе не важно


    Это очень важно !
    Неблок.режим использует для нотификации о гнездовых событиях механизм оконных сообщений. Чтобы этот механизм работал, нужен цикл ожидания-выборки-диспетчеризации оконных сообщений в том же потоке, который выполнил метод TClientSocket.Open.
    Поскольку в твоей dll этого цикла нет, то он так или иначе должен присутствовать в коде где-то за пределами твоей dll, например, в коде хост-приложения, в противном случае компонент работать не будет.
  • Сергей (29.04.09 21:24) [8]
    Самое интересное что у меня все замечательно работает
    Могу создавать и удалять динамические объекты TClientSocket в любой момент времени. Обмен пакета работает.
    В апликейшене если по событию расконекта изменить тип на блокирующий - все замечательно грохается.
    В dll не дает менять типа - так как типа есть связь,  закрытие соединение приводит к зацикливанию. Просто активность на false результата не даёт
  • Сергей М. © (30.04.09 08:15) [9]

    > Самое интересное что у меня все замечательно работает


    А теперь создай простейшее консольное приложение, вызови из него свою dll и удивись - работать твой неблокирующий ClientSocket не будет.
  • Сергей (30.04.09 16:49) [10]
    спасибо за разъяснение... dll будет использоваться из оконных положений
    так что проблем не будет

    как удалить объект я так и не узнал...
  • Empleado © (30.04.09 16:52) [11]

    > dll будет использоваться из оконных положений
    .....
    > как удалить объект я так и не узнал...

    see Сергей М. ©   (29.04.09 10:27) [5]
  • Сергей М. © (30.04.09 20:38) [12]

    > dll будет использоваться из оконных положений


    Даже если из оконных, не факт что твоя dll будет работоспособной.
    То что ты тестируешь работоспособность своей dll в простейшем "шаблонном" дельфийском тестовом VCL-приложении, вовсе не говорит о том, что та же dll будет работоспособна при ее использовании любым другим "оконным" приложением.
 
Конференция "Сети" » Как удалить динамически созданные ClientSocket при OnDisconnect?
Есть новые Нет новых   [134435   +33][b:0][p:0]