Форум: "Начинающим";
Текущий архив: 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