![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Цитата:
|