Тебе совершенно верно написали про Syncronize. Доступ и работа с VLC-объектами должны
происходить только в родительском потоке. Именно для этого и нужен вызов Syncronize.
Как я понимаю, ты используешь класс TServerSocket. На сколько я знаю, это абстрактный
класс и его не рекоммендуют использовать напрямую. Лучше объявить дочерний, и пользоваться
им. В нем же (в дочернем) можно объявить обработчики событий, и привязать их прямо в конструкторе.
Пригодятся обработчики таких событий как OnGetSocket и OnRead
OnGetSocket возникает перед создаем клиент-серверного socket'a вида TServerClientWinSocket
Именно через него идет чтение и отправка данных. Именно он участвует во всех других
событиях, как уникальный идентификатор подключенного клиента.
Я предлагаю сделать обработчик этого события и создавать не просто TServerClientWinSocket,
а сначала обявить некий дочерний от него класс (например TServerClientWinSocket_x) и
создавать его. Что это даст? Например в дочерний класс, можно добавить переменную, которая
будет собирать тебе строки от клиентов, пока не настанет время их вывести.
Обработчик может выглядеть так:
Код:
TServerSocket_x.OnGetSocket(Sender: TObject; _Socket: TSocket;
var ClientSocket: TServerClientWinSocket);
begin
// при создании клиентского сокета создаем экземпляр СВОЕГО сокета.
ClientSocket := TServerClientWinSocket_x.Create(_Socket, self.Socket);
end;
OnRead - ну тут все ясно. Возникает при необходисмости читать данные. И если ты решил меня
послушаться, и создал особый клиент-серверный объект сокета, то это решит твою проблему
со сбором строк. Просто складываешь их в переменную, пока не дойдешь до конца. А если
пришел указатель на конец данных, отправляй их на вывод через вызов Syncronize.
Как-то так.
Надеюсь, мои объяснения были понятны и помогли хоть как-то разобраться и составить план
действий.