|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как разграничить данные сетевых потоков?
Может быть тема не совсем понятная , но вопрос в следующем:
Имеется клиент-серверное приложение реализованное через idTCPClient и idTCPServer. Приложение сервер снимает изображение и звук с вебкамеры и передает его разными потоками клиенту (звук и изображение берутся разными компонентами). Программа клиент по таймеру сообщает программе серверу о необходимости отправки аудио или видеоданных (get_vid, get_aud). Программа сервер по execute отправляет данные по запросам. Таймер отправки аудиоданных -фиксирован. Таймер отправки видеоданных варьируется. Данные отправляются memoryStream'ами. В общем сущность проблемы: Когда видеотаймер устанавливается на низкий интервал (50-100мс) иногда получается так, что данные предназначенные для аудио попадают в видеобработчик, и наоборот. Я понимаю почему это происходит, но не понимаю как мне разделить их так, чтобы независимости от значения таймеров после команды клиента по отправке видоеданных, приходили только видеоданные, а после отправки клиентом команды получения аудио приходили только они. И никогда не нарушали бы этот порядок. Происходит примерно так: Код:
Клиент: WriteLn('Get_aud') readStream(aud_stream) Сервер: if ReadLn = 'Get_aud' then writeStream(Aud_stream) Тоже самое и по видео. Но иногда после команды клиента get_aud приходит кусок из vid_sream, соответственно вызывая всякие баги. ух... постарался изложить как мог понятнее... Подскажите пожалуйста, как сделать так, чтобы порядок выполнения команд не нарушался. Условия: должен использоваться только один порт. |
#2
|
||||
|
||||
Послк отправки данных отсылай признак окончания (сервер), до получения признака конца данных не менять тип получаемых данных (клиент).
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
Цитата:
Р.S. Может быть существует какая нибудь хитрая инструкция к процедуре не прерывать выполнение пока процедура не завершится. Я так понимаю таймеры как-то перехватывают выполнение кода на себя, даже если текущая процедура не завершена. |
#4
|
||||
|
||||
Код:
procedure Timer1OnTimer(Sender:TObject); begin Timer1.Enabled:=False; SomeWork(somedata); Timer1.Enabled:=True; end; Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#5
|
|||
|
|||
Цитата:
|