Показать сообщение отдельно
  #8  
Старый 14.02.2013, 15:36
ispovedn1k ispovedn1k вне форума
Прохожий
 
Регистрация: 20.12.2012
Сообщения: 2
Репутация: 10
По умолчанию

Тебе совершенно верно написали про 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.

Как-то так.

Надеюсь, мои объяснения были понятны и помогли хоть как-то разобраться и составить план
действий.
Ответить с цитированием