Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.06;
Скачать: CL | DM;

Вниз

Обмен данными посредством TCP/IP   Найти похожие ветки 

 
Roksolan   (2003-12-01 09:10) [0]

Доброго времени суток!

Пожалуйста помогите! Появилась странная проблема. В общем, нужно перетряхнуть программу передачи коротких текстовых сообщений по сети (раньше было через COM-порт). Протокол передачи в некоторых случаях подразумевает отправку сообщения другой машине и ожидание ответа в пределах 1 секунды. В общем, вешаю TNMMSGServ и TNMMSG на форму и пишу что-то вроде:

...
// глобальные переменные
var ReadString:String;
...
...
...
var WaitStart:TDateTime;
SendString:String;
...
begin // "Зацикленная процедура до момента выхода из программы
...
while "Пока пользователь не выйдет из проги" do begin
Application.ProcessMessages;
....
try
NMMSG1.PostIt(SendString);
except on e:exception do end;
WaitStart:=now;
ReadString:="";
while (now-WaitStart<1/(3600*24)) and (ReadString="") do
Application.ProcessMessages;
if ReadString<>"" then begin
.....
.....
// Обработка ответа
...
end;
....
end;
end;

....
procedure xxx(Sender:TComponent; const sFrom, sMSG:String);
// Процедура-обработчик OnMGG для NMMSGServ1
begin
ReadString:=sMSG;
end;


Все вроде хорошо, но эта штука нет-нет да зависает (стабильно), причем не обрабатывая никаких сигналов (форма не движется, не перерисовавается и т.п). Ежели кто знает, что я делаю неверно и как надо сделать, подскажите пжалста...

С Уважением Roksolan


 
Digitman ©   (2003-12-01 09:34) [1]

чем обоснован выбор именно FastNet-компонентов ?


 
Эдик   (2003-12-01 11:43) [2]

a. Не стоит исспользовать конструкции типа
while ... do Application.ProcessMesages на этот случай есть специальные свойства - OnConnect, OnDisconnect, OnRead и т.д.
Логика, имхо, должна быть такая...
1. Допустим по нажатию кнопки делаем connect
2. Через некоторое время происходит событие OnConnect - шлем сообщение, или событие OnError (ставит нас в известность, что пользователь не доступен).
3. Обработку получения сообщений закидываем в событие OnRead, которое происходит при поступлении сообщений из вне
b. Настоятельно не рекомендую использовать компоненты со страницы FastNet - гемороя от них больше, чем пользы (из личного опыта). По крайней мере, TNMMSGServ и TNMMSG мне пришлось поменять на ClientSocket и ServerSocket со страницы Internet, так как первые безбожно глючили, то подвисают, то не отправляют, особенно, когда связь не устойчивая... :-((((
Удачи!


 
Roksolan   (2003-12-02 22:21) [3]

Большое СПАСИБО. Опосля перехода на ClientSocket и ServerSocket программа перестала заниматься глупостями, которые в ней не заложены (типа повисания), а конструкция while ... do Application.ProcessMessages - просто мостик к старому протоколу, реализованному в этом пакете программ, который работал с COM-портом (причем RS485), а сейчас просто нет ни времени ни сил культурно переделывать программное для работы по локалке...


 
Digitman ©   (2003-12-03 08:08) [4]


> Roksolan


> Опосля перехода на ClientSocket и ServerSocket программа
> перестала заниматься глупостями, которые в ней не заложены
> (типа повисания),


ну отчего же ? стоит установить св-во TClientSocket.ClientType = ctBlocking, и получишь те же "глупости")


 
Roksolan   (2003-12-03 08:49) [5]

Ага, но по крайней мере хоть в help-е не забыли указать, что OnRead и его товарищи должны быть потокобезопастными...


 
Digitman ©   (2003-12-03 08:55) [6]

не знаю, что у тебя в хэлпе от Д6, но вот фрагмент Д5-хэлпа для TClientSocket.OnRead():

Occurs when a client socket should read information from the socket connection.

property OnRead: TSocketNotifyEvent;

Description

Write an OnRead event handler to read from the socket connection. If the socket is a blocking socket, use a TWinSocketStream object to read from the connection. Otherwise, use the methods of the Socket parameter to perform the actual reading.

не вижу ничего, что хоть каким-то боком касалось т.н. "потокобезопасности"


 
Roksolan   (2003-12-04 09:09) [7]

Ага, но вот для TServerSocket.OnClientRead() в хелпе от D6 есть примечание:

Note: If ServerType is stThreadBlocking, make sure that all code in an OnClientRead event handler is thread-safe. Use the GetClientThread method of the Sender parameter to access thread-specific information.

:((


 
Digitman ©   (2003-12-04 09:32) [8]


> Roksolan


и что тебя в этом смущает ?


 
Roksolan   (2003-12-04 22:58) [9]

Да ничего, все уже переписано и два дня как фунциклирует!



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

Текущий архив: 2004.02.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
3-16037
ИМХО
2004-01-12 23:47
2004.02.06
Частичная загрузка БД


14-16590
RealRascal
2004-01-15 01:23
2004.02.06
50гц


1-16495
Lt
2004-01-26 10:52
2004.02.06
Вставка рисунка в Word


3-16170
Tt
2004-01-14 12:08
2004.02.06
Логич.поля и dxDBGrid


4-16835
Suharew
2003-12-02 21:33
2004.02.06
Заражение Exe файла