![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#8
|
|||
|
|||
![]() Тебе совершенно верно написали про 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. Как-то так. Надеюсь, мои объяснения были понятны и помогли хоть как-то разобраться и составить план действий. |