Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.07.2012, 16:09
Yarcim Yarcim вне форума
Прохожий
 
Регистрация: 08.06.2012
Сообщения: 9
Репутация: 10
По умолчанию Как разграничить данные сетевых потоков?

Может быть тема не совсем понятная , но вопрос в следующем:
Имеется клиент-серверное приложение реализованное через 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  
Старый 16.07.2012, 16:37
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Послк отправки данных отсылай признак окончания (сервер), до получения признака конца данных не менять тип получаемых данных (клиент).
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 16.07.2012, 16:59
Yarcim Yarcim вне форума
Прохожий
 
Регистрация: 08.06.2012
Сообщения: 9
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Послк отправки данных отсылай признак окончания (сервер), до получения признака конца данных не менять тип получаемых данных (клиент).
Хм...я уже так пытался делать что-то подобное. Ограничивал начало и конец данных. Запрет смены типа данных, приводит к потере отдельных пакетов (как правило аудио). И таймеры начитают работать через раз. Может конечно я что-то ни так делаю. Если приложите какой нибудь неочевидный пример, буду благодарен.

Р.S. Может быть существует какая нибудь хитрая инструкция к процедуре не прерывать выполнение пока процедура не завершится. Я так понимаю таймеры как-то перехватывают выполнение кода на себя, даже если текущая процедура не завершена.
Ответить с цитированием
  #4  
Старый 16.07.2012, 17:58
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Код:
procedure Timer1OnTimer(Sender:TObject);
begin
  Timer1.Enabled:=False;
  SomeWork(somedata);
  Timer1.Enabled:=True;
end;
оно?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Aristarh Dark за это полезное сообщение:
OTVET2 (18.01.2013), Yarcim (18.07.2012)
  #5  
Старый 18.07.2012, 17:49
Yarcim Yarcim вне форума
Прохожий
 
Регистрация: 08.06.2012
Сообщения: 9
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Код:
procedure Timer1OnTimer(Sender:TObject);
begin
  Timer1.Enabled:=False;
  SomeWork(somedata);
  Timer1.Enabled:=True;
end;
оно?
Неа, стало немного лучше, но проблема осталась. В любом случае спасибо буду разбираться.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:35.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter