Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.09.12;
Скачать: [xml.tar.bz2];

Вниз

TClientSocket в DLL   Найти похожие ветки 

 
GanibalLector ©   (2010-06-17 00:49) [0]

Делал сегодня OLE библиотеку и возник вопрос.
Вот, смотрите, так все работает :


type
 TInd = class(TAutoObject, IInd)
 private
   FHost:String;
 protected
   ...
   procedure Start; safecall;
   ...
 end;

implementation

uses ComServ,Windows;

var Sock:TClientSocket;

...

procedure TInd.Start;
begin
 Sock.Address:=FHost;
 Sock.Port:=3107;
 Sock.ClientType:=ctNonBlocking;
 Sock.Open;
end;

...

initialization
 TAutoObjectFactory.Create(ComServer, TInd, Class_Ind, ciMultiInstance, tmSingle);
 Sock:=TClientSocket.Create(nil);
finalization
 Sock.Free;
end.


А вот так, ни бильмеса не работает:


type
 TInd = class(TAutoObject, IInd)
 private
   Sock:TClientSocket;
   FHost:String;
 protected
   ...
   procedure Start; safecall;
   ...
 end;

...

procedure TInd.Start;
begin
 Sock:=TClientSocket.Create(nil);
 Sock.Address:=FHost;
 Sock.Port:=3107;
 Sock.ClientType:=ctNonBlocking;
 Sock.Open;
end;

...

initialization
 TAutoObjectFactory.Create(ComServer, TInd, Class_Ind, ciMultiInstance, tmSingle);
end.


Почему? Объясните убогому.

Спасибо!

З.Ы. Если не ошибаюсь, то когда-то видел ветку о том, что нельзя использовать TClientSocket в библиотеках и OLE. Или в параметре TClientSocket.Create(nil) nil нельзя использовать.


 
Сергей М. ©   (2010-06-17 09:16) [1]


> нельзя использовать TClientSocket в библиотеках и OLE. Или
> в параметре TClientSocket.Create(nil) nil нельзя использовать.
>


Ересь.


> Объясните убогому


Почему бы "убогому" для начала не объяснить что значит "ни бильмеса не работает" ?)


 
программер   (2010-06-17 10:12) [2]


> "ни бильмеса не работает" ?)

бильмес - не знать.


 
GanibalLector ©   (2010-06-17 11:24) [3]

2 Сергей М. ©   (17.06.10 09:16) [1]

>Ересь.

Вот, нашел. Между прочим, там Ваше высказывание. См [7]
http://delphimaster.net/view/6-1240921108/


 
Сергей М. ©   (2010-06-17 11:28) [4]


> GanibalLector ©   (17.06.10 11:24) [3]


И что ?
Где там сказано про "нельзя" ?


 
GanibalLector ©   (2010-06-17 11:33) [5]

2 Сергей М. ©   (17.06.10 09:16) [1]
>Почему бы "убогому" для начала не объяснить что значит "ни бильмеса не работает" ?)

Объясняю. Сокет создается, но процедура Sock.Open не приводит к желаемому результату. Если после выполнения Sock.Open  посмотреть состояние сокета Sock.Active, то можно увидеть, что там False.


 
GanibalLector ©   (2010-06-17 11:37) [6]

2 Сергей М. ©   (17.06.10 11:28) [4]
>Где там сказано про "нельзя" ?

Согласен. Там не написано, что нельзя. Пардон.
Там написано, что "Чтобы этот механизм работал, нужен цикл ожидания-выборки-диспетчеризации оконных сообщений в том же потоке, который выполнил метод TClientSocket.Open."

В моей библиотеке тоже нет "цикла ожидания-выборки-диспетчеризации оконных сообщений". Я даже не пойму о чем речь. Подскажите, лучше примером.

Спасибо!


 
Сергей М. ©   (2010-06-17 11:38) [7]


> после выполнения Sock.Open  посмотреть состояние сокета
> Sock.Active, то можно увидеть, что там False


Ну все правильно, так и должно быть для неблок.режима)
Как раз та самая ситуация, о которой я говорил в постах [7], [9] по приведенной тобой ссылке.


 
Сергей М. ©   (2010-06-17 11:39) [8]


> даже не пойму о чем речь


Не проще ли будет воспользоваться блок.режимом ?


 
GanibalLector ©   (2010-06-17 11:45) [9]

2 Сергей М. ©   (17.06.10 11:39) [8]


> Не проще ли будет воспользоваться блок.режимом ?


Проще. Но я хочу все знать. Если не затруднит - расскажите(покажите минимальным примером).


 
Сергей М. ©   (2010-06-17 11:54) [10]

var
 Msg: TMsg;
..

ClientSocket.Open;
while not ClientSocket.Active do begin
 if PeekMessage(Msg, 0, CM_SOCKETMESSAGE, CM_LOOKUPCOMPLETE, PM_REMOVE) then
 DispatchMessage(Msg);
Sleep(0);
end;


Вряд ли он тебе поможет.


 
Вариант   (2010-06-17 12:14) [11]


> GanibalLector ©   (17.06.10 11:37) [6]


> В моей библиотеке тоже нет "цикла ожидания-выборки-диспетчеризации
> оконных сообщений". Я даже не пойму о чем речь. Подскажите,
>  лучше примером

Речь о том, что сокет может быть настроен на разные схемы работы.
TClientSocket из "множества" схем использует только два, в зависимости от
ClientType. Это блокирующий режим - вызвал операцию(функцию) работы с сокетом -пока она не завершилась, функция не вернет результат - поток блокирован. И не блокирующий режим в варианте AsyncSelect - вызов функции  работы с сокетом не блокирует работу потока, а сразу возвращает управление, но сама вызванная операция может быть не завершена и уведомление о завершении ее работы прийдет позже. AsyncSelect подразумевает, что уведомление передается с помощью оконных сообщений. Если есть желание знать подробней - ищи литературу по работе с сетями, смотри  код реализации в исходниках дельфи, почитай справку MSDN по WSAAsyncSelect например.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.09.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
15-1276625703
George
2010-06-15 22:15
2010.09.12
Импровизация


15-1276424776
George
2010-06-13 14:26
2010.09.12
Шифрование на Delphi и PHP


2-1275988122
worldmen
2010-06-08 13:08
2010.09.12
Структура файлов караоке - kar. Или как извлеч текст


15-1276959726
ArtGrek
2010-06-19 19:02
2010.09.12
Protocol


2-1274947026
Dzmitry
2010-05-27 11:57
2010.09.12
A call to an OS function failed





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский