Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по Demos Internet NetChat    Найти похожие ветки 

 
GuAV ©   (2006-01-10 12:32) [0]

Зачем там поток TClientDataThread ?
Почему нельзя сразу в мемо ?
И почему нельзя использовать на одной машине только TTcpClient, а на другой - только TTcpServer для данной задачи ?

 // you must create your own thread to synch
 // writing to a gui component
 TClientDataThread = class(TThread)
 private
 public
   ListBuffer :TStringList;
   TargetList :TStrings;
   procedure synchAddDataToControl;
   constructor Create(CreateSuspended: Boolean);
   procedure Execute; override;
   procedure Terminate;
 end;

...

procedure TForm1.TcpServer1Accept(sender: TObject;
 ClientSocket: TCustomIpClient);
var
 s: string;
 DataThread: TClientDataThread;
begin
 // create thread
 DataThread:= TClientDataThread.Create(true);
 // set the TagetList to the gui list that you
 // with to synch with.
 DataThread.TargetList := memRecv.lines;

 // Load the Threads ListBuffer
 DataThread.ListBuffer.Add("*** Connection Accepted ***");
 DataThread.ListBuffer.Add("Remote Host: " + ClientSocket.LookupHostName(ClientSocket.RemoteHost) +
  " (" + ClientSocket.RemoteHost + ")");
 DataThread.ListBuffer.Add("===== Begin message =====");
 s := ClientSocket.Receiveln;
 while s <> "" do
 begin
   DataThread.ListBuffer.Add(s);
   s := ClientSocket.Receiveln;
 end;
 DataThread.ListBuffer.Add("===== End of message =====");

 // Call Resume which will execute and synch the
 // ListBuffer with the TargetList
 DataThread.Resume;

end;


 
umbra ©   (2006-01-10 12:59) [1]

может, на случай нескольких клиентов, приславших сообщения одновременно?
поэтому и сервер нужен.


 
GuAV ©   (2006-01-10 13:25) [2]


> может, на случай нескольких клиентов, приславших
> сообщения одновременно?

Я вот тоже так подумал но... как при этом может помочь этот TClientDataThread ? Или TcpServer1Accept вызывается не в контексте основного потока ?

Кстати, код потока:
procedure TClientDataThread.Execute;
begin
 Synchronize(synchAddDataToControl);
end;

procedure TClientDataThread.synchAddDataToControl;
begin
TargetList.AddStrings(ListBuffer);
end;


 
umbra ©   (2006-01-10 13:42) [3]

как я понимаю, TcpServer1Accept вызывается, когда коннектится новый клиент. А в это время может идти обмен данными с другим клиентом. Кроме того, в этом примере свойство BlockMode сервера установлено в  bmThreadBlocking, чтобы обеспечить возможность подключения многих клиентов, и сохранить целостность их данных (т.е чтобы строки разных сообщений не перепутались)



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

Форум: "Сети";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.012 c
15-1143469162
Piter
2006-03-27 18:19
2006.04.23
Программа для определения mp3


2-1144133902
veb
2006-04-04 10:58
2006.04.23
Запретить перерисовку DBGrida


2-1144272382
in-tank
2006-04-06 01:26
2006.04.23
Как хранить данные для подсказок.


2-1144574333
STK
2006-04-09 13:18
2006.04.23
Ошибка с типом и масивом, что не пойму


3-1141056218
Sollo
2006-02-27 19:03
2006.04.23
dbexpress нужна временная таблица ?





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