|
Вопрос # 6 228/ вопрос закрыт / |
|
Здравствуйте!
Суть вопроса: что неправильно пишу? Процедура OnRead сервера не работает, подскажите как написать правильно.
Приложение: Переключить в обычный режим- unit Unit2;
-
- interface
-
- uses
- SysUtils, Dialogs, Classes, ScktComp;
-
- type
- ThServer = class(TThread)
- private
- Sx1:TServerSocket;
- procedure sSClientRead(Sender: TObject; Socket: TCustomWinSocket);
- protected
- procedure Execute; override;
- end;
-
-
-
- implementation
-
-
- procedure ThServer.Execute;
- begin
- Sx1:=TServerSocket.Create(nil);
- Sx1.OnClientRead:=sSClientRead;
- Sx1.Port:=4040;
- Sx1.ServerType:=stNonBlocking;
- Sx1.Active:=True;
- While Sx1.Active = True do Sleep(50);
- end;
-
-
-
-
- procedure ThServer.sSClientRead(Sender: TObject; Socket: TCustomWinSocket);
- var
- S,sf,s1,s2,s3,s4,s5,s6,s7,s8:string;
- i,n:integer;
- begin
- S:=Socket.ReceiveText;
-
- ShowMessage(s);
-
- n:=0;
- while length(S) > 0 do begin
- i:=pos('|',S);
- sf:=copy(S,1,i-1);
- delete(S,1,length(sf)+1);
- n:=n+1;
-
- if n = 1 then s1:=sf;
- if n = 2 then s2:=sf;
- if n = 3 then s3:=sf;
- if n = 4 then s4:=sf;
- if n = 5 then s5:=sf;
- if n = 6 then s6:=sf;
- if n = 7 then s7:=sf;
- if n = 8 then s8:=sf;
- end;
-
-
- if s1 = 'Privet' then ShowMessage(s1);
-
- end;
-
- end.
 |
Вопрос задал: 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™ (статус: Доктор наук), 22 июля 2012, 09:57 [#1]:
Цитата (DimonZ):
Процедура OnRead сервера не работает
Что значит "не работает"? Не вызывается обработчик события?
Брейк туда ставил? Проверял?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DimonZ (статус: Посетитель), 22 июля 2012, 10:19 [#2]:
Хотел ответ, получил вопрос )) , нет Брейк не ставил, потому как не знаю куда и что проверять, кстати по этому поводу вопрос и задал
|
|
DimonZ (статус: Посетитель), 22 июля 2012, 17:55 [#3]:
Да, не вызываеться обработчик события
|
|
min@y™ (статус: Доктор наук), 23 июля 2012, 08:09 [#4]:
Цитата (DimonZ):
нет Брейк не ставил, потому как не знаю куда
Вот сюда поставь
S:=Socket.ReceiveText;
Цитата (DimonZ):
Да, не вызываеться обработчик события
Может быть, обработчик события не назначен самому событию? Проверь.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DimonZ (статус: Посетитель), 25 июля 2012, 20:16 [#5]:
Мне желательно пример, я так долго буду блуждать, и возможно не прийду к цели
|
|
min@y™ (статус: Доктор наук), 26 июля 2012, 08:10 [#6]:
Цитата (DimonZ):
Мне желательно пример
Пример чего?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DimonZ (статус: Посетитель), 26 июля 2012, 18:41 [#7]:
Пример работаещего сервера в Thread, чтобы принимал сообщения
|
|
DimonZ (статус: Посетитель), 4 августа 2012, 15:42 [#8]:
Товарищи эксперты, я понимаю что видимо задал не сверх сложный вопрос, но ответ ищу уже довольно долго, поэтому прошу выложите мне рабочий пример сокетного сервера в отдельном потоке Thread, если вы думаете что я ленивый и задаю вопросы не поискав ответы в интернете то вы ошибаетесь, к примеру использование Flash в своей прогремме я добился сам. Думаю вы будете благосклонны и все таки ответите на мой вопрос, заранее благодарен...
|
|
min@y™ (статус: Доктор наук), 8 августа 2012, 20:41 [#9]:
Цитата (DimonZ):
если вы думаете что я ленивый и задаю вопросы не поискав ответы в интернете то вы ошибаетесь
Ну нету у нас, видать, такого примера, что поделать...
Если бы у меня был, я бы поделился, честно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DimonZ (статус: Посетитель), 10 августа 2012, 17:34 [#10]:
да я уже понял суть своего вопроса и сам ))
|
24 сентября 2012, 11:35: Вопрос закрыт (решение принял DNK): Автор 2 месяца не интересуется вопросом.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|