-
Смотрю Delphi7\Demos\Internet\NetChat
Зачем там поток? Все работает с закомментированными строками
procedure TForm1.TcpServer1Accept(sender: TObject; ClientSocket: TCustomIpClient); var s: string; //DataThread: TClientDataThread; begin // DataThread:= TClientDataThread.Create(true); // DataThread.TargetList := mmoRecv.lines; // DataThread.ListBuffer.Add('===== Begin message ====='); s := ClientSocket.Receiveln; while s <> '' do begin mmoRecv.Lines.Add(s); // DataThread.ListBuffer.Add(s); s := ClientSocket.Receiveln; end; // DataThread.ListBuffer.Add('===== End of message ====='); // DataThread.Resume;
-
> Зачем там поток?
А TcpServer1Accept в контексте какого потока выполняется? Основного, где GUI или дополнительного? Если в дополнительном, то по всей видимости для синхронизации с GUI. Без синхронизации оно будет работать, но ненадежно, особенно если клиентов станет много.
-
>> А TcpServer1Accept в контексте какого потока выполняется? Основного Закомментированный DataThread - его список в контексте главного потока заполняется в обработчике Accept, и в контексте главного же и выводится
//------------- TClientDataThread impl ----------------------------------------- constructor TClientDataThread.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); FreeOnTerminate := true; ListBuffer := TStringList.Create; end;
procedure TClientDataThread.Terminate; begin ListBuffer.Free; inherited; end;
procedure TClientDataThread.Execute; begin Synchronize(synchAddDataToControl); end;
procedure TClientDataThread.synchAddDataToControl; begin TargetList.AddStrings(ListBuffer); end; //------------- end TClientDataThread impl -------------------------------------
> Без синхронизации оно будет работать, но ненадежно,
тут да по опытам, на тестовых обменах с 20 копиями-клиентами видны конкретные глюки Правда, если в исходном виде оставить, они тоже есть :)
-
> [ВладОшин] © (04.11.13 20:10) [2]
> Основного
Ну если основного, то этот поток там и не нужен. А даже если бы и не основного, то глупо создавать каждый раз поток на каждого клиента исключительно для синхронизации вместо того, чтобы создать один единственный поток для синхронизации с GUI с потокозащищенным списком строк.
-
Данные могут быть большими, а обработка событий должно быть коротким иначе 1) программа будет зависать. 2) т.е. Может начаться забивание очереди сообщений и как только вся очередь закончится программа зависнет. И не будет реагировать на сообщения. И в конечном счёте просто не обработает дисканект и уже не сможет принять данные, и обработать сообщения. Т.е. целиком зависнет. Правда это худший вариант. В реалии скорее всего будет чуточку иначе.
-
По правка не большим, а долгим.
-
> Павиа (04.11.13 20:43) [4]
> Данные могут быть большими, а обработка событий должно быть > коротким
Ну такой поток как там в этом случае все равно не поможет, он там ничего не делает, кроме как перекидывает список строк через Synchronize в Memo
-
> он там ничего не делает, кроме как перекидывает список
да вот именно И заполняется, и выводится - в основном потоке. Неудачный пример какой-то
|