Форум: "Сети";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизОбмен данными посредством 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.031 c