Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
3-16136
Серж
2004-01-14 10:21
2004.02.06
Вернуть данные из процедуры Oracle в dbgrid Delphi


14-16744
Dark Simpson
2004-01-15 19:58
2004.02.06
Геморрой с Офисом 97


1-16440
Globoor
2004-01-28 11:15
2004.02.06
сливание документов в один файл


14-16682
SergP
2004-01-17 04:00
2004.02.06
Помогите с настройками ORACLE8i


14-16701
ИМХО
2004-01-17 06:09
2004.02.06
HEX редактор





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