Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 228

/ вопрос закрыт /

Здравствуйте!
Суть вопроса: что неправильно пишу? Процедура OnRead сервера не работает, подскажите как написать правильно.

Приложение:
  1. unit Unit2;
  2.  
  3. interface
  4.  
  5. uses
  6. SysUtils, Dialogs, Classes, ScktComp;
  7.  
  8. type
  9. ThServer = class(TThread)
  10. private
  11. Sx1:TServerSocket;
  12. procedure sSClientRead(Sender: TObject; Socket: TCustomWinSocket);
  13. protected
  14. procedure Execute; override;
  15. end;
  16.  
  17.  
  18.  
  19. implementation
  20.  
  21.  
  22. procedure ThServer.Execute;
  23. begin
  24. Sx1:=TServerSocket.Create(nil);
  25. Sx1.OnClientRead:=sSClientRead;
  26. Sx1.Port:=4040;
  27. Sx1.ServerType:=stNonBlocking;
  28. Sx1.Active:=True;
  29. While Sx1.Active = True do Sleep(50);
  30. end;
  31.  
  32.  
  33.  
  34.  
  35. procedure ThServer.sSClientRead(Sender: TObject; Socket: TCustomWinSocket);
  36. var
  37. S,sf,s1,s2,s3,s4,s5,s6,s7,s8:string;
  38. i,n:integer;
  39. begin
  40. S:=Socket.ReceiveText;
  41.  
  42. ShowMessage(s);
  43.  
  44. n:=0;
  45. while length(S) > 0 do begin
  46. i:=pos('|',S);
  47. sf:=copy(S,1,i-1);
  48. delete(S,1,length(sf)+1);
  49. n:=n+1;
  50.  
  51. if n = 1 then s1:=sf;
  52. if n = 2 then s2:=sf;
  53. if n = 3 then s3:=sf;
  54. if n = 4 then s4:=sf;
  55. if n = 5 then s5:=sf;
  56. if n = 6 then s6:=sf;
  57. if n = 7 then s7:=sf;
  58. if n = 8 then s8:=sf;
  59. end;
  60.  
  61.  
  62. if s1 = 'Privet' then ShowMessage(s1);
  63.  
  64. end;
  65.  
  66. end.


DimonZ Вопрос закрыт (ответы не принимаются, мини-форум закрыт)

Вопрос задал: DimonZ (статус: Посетитель)
Вопрос отправлен: 21 июля 2012, 23:20
Состояние вопроса: закрыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, DimonZ!
Не будет Ваш код работать. Потому что он не должен работать по всем законам Майкрософта. Вы пытаетесь заставить в отдельном потоке работать компонент, при этом, заметим, в неблокирующем режиме. А этот компонент может работать только в главном потоке - ему нужен доступ к очереди сообщений.
Если хотите использовать этот компонент в отдельном потоке - переводите его в блокирующий режим. Но только в этом случае, onRead не будет работать - оно то для неблокирующего режима только. Нужно будет читать самостоятельно. Вот только одна беда - это не характерный режим для него:)
Почитайте, что ли о synapse (https://www.delphi-int.ru/articles/49/). С ними проще - записал-вычитал-обработал.

Замечу, что в том то и прелесть отдельного потока, что не нужно событие onRead - данные можно читать сразу, по месту. А onRead возник, потому что неизвестно, сколько нужно ещё ждать данных, а окна рисовать кому то нужно. ( этот способ появился в старых виндовсах, 3.1, где была корпоративная многозадачность. И если один тред не хотел отдавать свой квант времени, то вся система висела. Наглухо. А ожидание данных с сокета - это как раз такая ситуация.)

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 4 августа 2012, 22:09


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 10 августа 2012, 17:34; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 22 июля 2012, 09:57 [#1]:

Цитата (DimonZ):

Процедура OnRead сервера не работает

Что значит "не работает"? Не вызывается обработчик события?
Брейк туда ставил? Проверял?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DimonZ

DimonZ (статус: Посетитель), 22 июля 2012, 10:19 [#2]:

Хотел ответ, получил вопрос )) , нет Брейк не ставил, потому как не знаю куда и что проверять, кстати по этому поводу вопрос и задал
DimonZ

DimonZ (статус: Посетитель), 22 июля 2012, 17:55 [#3]:

Да, не вызываеться обработчик события
min@y™

min@y™ (статус: Доктор наук), 23 июля 2012, 08:09 [#4]:

Цитата (DimonZ):

нет Брейк не ставил, потому как не знаю куда

Вот сюда поставь
S:=Socket.ReceiveText;

Цитата (DimonZ):

Да, не вызываеться обработчик события

Может быть, обработчик события не назначен самому событию? Проверь.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DimonZ

DimonZ (статус: Посетитель), 25 июля 2012, 20:16 [#5]:

Мне желательно пример, я так долго буду блуждать, и возможно не прийду к цели
min@y™

min@y™ (статус: Доктор наук), 26 июля 2012, 08:10 [#6]:

Цитата (DimonZ):

Мне желательно пример

Пример чего?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DimonZ

DimonZ (статус: Посетитель), 26 июля 2012, 18:41 [#7]:

Пример работаещего сервера в Thread, чтобы принимал сообщения
DimonZ

DimonZ (статус: Посетитель), 4 августа 2012, 15:42 [#8]:

Товарищи эксперты, я понимаю что видимо задал не сверх сложный вопрос, но ответ ищу уже довольно долго, поэтому прошу выложите мне рабочий пример сокетного сервера в отдельном потоке Thread, если вы думаете что я ленивый и задаю вопросы не поискав ответы в интернете то вы ошибаетесь, к примеру использование Flash в своей прогремме я добился сам. Думаю вы будете благосклонны и все таки ответите на мой вопрос, заранее благодарен...
min@y™

min@y™ (статус: Доктор наук), 8 августа 2012, 20:41 [#9]:

Цитата (DimonZ):

если вы думаете что я ленивый и задаю вопросы не поискав ответы в интернете то вы ошибаетесь

Ну нету у нас, видать, такого примера, что поделать...
Если бы у меня был, я бы поделился, честно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DimonZ

DimonZ (статус: Посетитель), 10 августа 2012, 17:34 [#10]:

да я уже понял суть своего вопроса и сам ))

24 сентября 2012, 11:35: Вопрос закрыт (решение принял DNK): Автор 2 месяца не интересуется вопросом.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:47
Выполнено за 0.02 сек.