![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с TclientSocket [D5]
_san_ © (2003-12-10 18:29:00)
Добрый вечер!
Почему когда я ставлю свойство
ClientSocket.ClientType:= ctBlocking;
у меня перестают читаться данные от другого приложения?
Если ClientSocket.ClientType:= ctNonBlocking;
то все нормально.
_san_ (2003-12-11 15:10:00) [1]
>Если сервер твой - то наиболее правильно перед посылкой данных >посылать их размер.
>что же мешает передающей стороне предварять поток собственно >данных префиксом их размера ?
Сервер не мой, но договориться, наверное можно, чтобы они у себя добавили размер передаваемых данных.
Все.
Всем спасибо!
Digitman (2003-12-11 14:02:00) [2]
> при этом я не знаю размер получаемых данных
что же мешает передающей стороне предварять поток собственно данных префиксом их размера ? чтобы приним.сторона, получив сначала префикс, ожидала следом данные заведомо известного размера ?
savva (2003-12-11 14:01:00) [3]
Если сервер твой - то наиболее правильно перед посылкой данных посылать их размер. Если не твой - то расскажи про него подробнее. Можно наверное по времени отсутствия данных (ИМХО не самый красивый путь) и то при условии что даные идут не активно.
К тому же прочитать больше чем пришло тебе не удастся. Вопрос другой, а являются полученные данные целостными или это какая то часть. А чтоб ответить на этот вопрос - читай начало этого ответа..
Digitman (2003-12-11 13:59:00) [4]
а зачем его ожидать ? когда принятые данные будут доступны, возникнет событие OnRead, осн.поток прочитает их в обработчике события и, если обработка данных длительная, передаст данные на обработку доп.потоку, если же недолгая обработка - тут же и обработает их
все прочее время, между моментами возникновения событий OnRead() осн.поток может и будет реагировать на все прочие сообщения/события, в т.ч. и события польз.интерфейса
главное - чтобы обработка ЛЮБЫХ сообщений/событий в код.потоке была по возможности максимально быстрой
_san_ (2003-12-11 13:56:00) [5]
Спасибо за помощь.
У меня еще вопрос: а если я буду читать данные функцией Read(), то можно ли как-нибудь определить, что все данные прочитаны, при этом я не знаю размер получаемых данных.
savva (2003-12-11 13:54:00) [6]
ну в хелпе же написано "
Set the ErrorCode parameter to 0 if the OnError event handler successfully deals with the error condition, to prevent an ESocketError from being raised"
то бишь установи параметр ErrorCode равным 0 если обработчик события OnError успешно выполнен для предотвращения возбуждения ошибки ESocketError (очень вольный перевод:))
_san_ (2003-12-11 13:53:00) [7]
дополнительный поток мне нужен для того чтобы приложение не подвисало когда я ожидаю события приема данных с помощью функции WaitForSingleObject
_san_ (2003-12-11 13:50:00) [8]
событие OnError действительно спасает, но при этом системное сообщение об ошибке соединения все равно вылетает.
Digitman (2003-12-11 12:20:00) [9]
> В потоке происходит формирование посылки
> Которую посылаю через сокет
а что, это нельзя сделать в основном потоке ? режим же - неблокирующий тебе нужен, сам говоришь ... зачем доп.поток-то ?
savva (2003-12-11 11:56:00) [10]
для асинхронного режима событие OnError и тип TSocketErrorEvent спасут отца русской демократии :)
_san_ (2003-12-11 11:52:00) [11]
А нет другой возможности перехватывать сообщение об ошибки соединения:
if not ClientSocket1.Active then
begin
try
ClientSocket1.Active:= true;
except
MessageDlg(‘Связь с устройством не установлена.",
mtError , [mbOK], 0);
end;
end;
без использования:
ClientSocket.ClientType:= ctBlocking;
Digitman (2003-12-11 10:38:00) [12]
событие OnRead() в блок.режиме не возбуждается, ибо предназначено оно для асинхр.нотификации, а блок.режим подразумевает синхронность обращений к трансп.ф-циям гнезда
_san_ (2003-12-10 19:20:00) [13]
//Открываю сокет
ClientSocket1.ClientType:= ctNonBlocking;
if not ClientSocket1.Active then
begin
try
ClientSocket1.Active:= true;
except
MessageDlg(‘Связь с устройством не установлена.",
mtError , [mbOK], 0);
end;
end;
//Создаю поток - в нем будет вестись обработка данных
Myhread := TMyThread.Create(true);
В потоке происходит формирование посылки
Которую посылаю через сокет
ClientSocket1.Socket.SendText(strSend);
Далее ожидаю ответа
//с контроллера
hRel:= WaitForSingleObject(SinglEnblWrDataMem, 5000);
if hRel = 0 then
begin
…..
…..
end;
Если ClientSocket.ClientType:= ctNonBlocking; то ответ приходит
А если ClientSocket.ClientType:= ctBlocking; то нет
Сигнал SinglEnblWrDataMem устанавливается в функциии, когда приходят данные:
procedure ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
Digitman (2003-12-10 18:58:00) [14]
приводи сюда свой код
_san_ (2003-12-10 18:50:00) [15]
А не у кого нет ссылок на примеры по программированию сокетов?
Digitman (2003-12-10 18:36:00) [16]
значит, логика неверна