Конференция "Сети" » Не пойму, зачем так сложно? [D7]
 
  • [ВладОшин] © (04.11.13 17:25) [0]
    Смотрю
    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;
  • DVM © (04.11.13 19:52) [1]

    > Зачем там поток?

    А TcpServer1Accept в контексте какого потока выполняется? Основного, где GUI или дополнительного? Если в дополнительном, то по всей видимости для синхронизации с GUI. Без синхронизации оно будет работать, но ненадежно, особенно если клиентов станет много.
  • [ВладОшин] © (04.11.13 20:10) [2]
    >> А 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 копиями-клиентами видны конкретные глюки
    Правда, если в исходном виде оставить, они тоже есть :)
  • DVM © (04.11.13 20:21) [3]

    > [ВладОшин] ©   (04.11.13 20:10) [2]


    > Основного

    Ну если основного, то этот поток там и не нужен. А даже если бы и не основного, то глупо создавать каждый раз поток на каждого клиента исключительно для синхронизации вместо того, чтобы создать один единственный поток для синхронизации с GUI с потокозащищенным списком строк.
  • Павиа (04.11.13 20:43) [4]
    Данные могут быть большими, а обработка событий должно быть коротким иначе 1) программа будет зависать.
    2) т.е. Может начаться забивание очереди сообщений и как только вся очередь закончится программа зависнет. И не будет реагировать на сообщения. И в конечном счёте просто не обработает дисканект и уже не сможет принять данные, и обработать сообщения. Т.е. целиком зависнет.
    Правда это худший вариант. В реалии скорее всего будет чуточку иначе.
  • Павиа (04.11.13 20:50) [5]
    По правка не большим, а долгим.
  • DVM © (04.11.13 21:04) [6]

    > Павиа   (04.11.13 20:43) [4]


    > Данные могут быть большими, а обработка событий должно быть
    > коротким

    Ну такой поток как там в этом случае все равно не поможет, он там ничего не делает, кроме как перекидывает список строк через Synchronize в Memo
  • [ВладОшин] © (04.11.13 23:10) [7]

    > он там ничего не делает, кроме как перекидывает список

    да вот именно
    И заполняется, и выводится - в основном потоке.
    Неудачный пример какой-то
 
Конференция "Сети" » Не пойму, зачем так сложно? [D7]
Есть новые Нет новых   [118639   +35][b:0][p:0]