Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сервек - Клиент

55K
23 ноября 2010 года
Frio
25 / / 26.08.2010
Делаю прогру в которой передаются по инету с клиента на серв и обратно координаты типа TPoint;
 
Код:
if(ServerSocket1->Active==true)
    for(int i=0;i<100;i++)
     ServerSocket1->Socket->Connections[0]->SendBuf(&CreaturePos[1],sizeof(TPoint));
   else
    for(int i=0;i<100;i++)
     ClientSocket1->Socket->SendBuf(&CreaturePos[1],sizeof(TPoint));


В итоге при передвижении обьектов в клиенте , на сервере они двигаются оставляя за собой следы....тоесть , допустим передвигается точка..при передвижении она оставляет за собой свои изображения которые пропадают со временем. Что это может быть ? Может нужно както чистить буффер ? Или что ?
55K
23 ноября 2010 года
Frio
25 / / 26.08.2010
Отправка происходит каждые 10 мс.
33K
23 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Цитата: Frio
В итоге при передвижении обьектов в клиенте , на сервере они двигаются оставляя за собой следы....тоесть , допустим передвигается точка..при передвижении она оставляет за собой свои изображения которые пропадают со временем. Что это может быть ? Может нужно както чистить буффер ? Или что ?


В смысле, оставляют за собой изображение? На сервере отрисовка идет или что? Можно еще на этот код взглянуть? Пробывал смотерть значения точек своих животных в отладчике?
А глянуть на исходники клиента можно или это сакральная тайна?

11
23 ноября 2010 года
oxotnik333
2.9K / / 03.08.2007
какая точка? какое изображение? какие следы? кто все эти люди? при чем тут клиент-сервер?
55K
23 ноября 2010 года
Frio
25 / / 26.08.2010
Вот код прорисовки
 
Код:
if(Player==1) Game->Canvas->Pen->Color=RGB(255,0,0); else Game->Canvas->Pen->Color=RGB(0,0,255);
      Game->Canvas->Ellipse(CreaturePos[1].x,CreaturePos[1].y,CreaturePos[1].x-4,CreaturePos[1].y-4);
       if(Player==2) Game->Canvas->Pen->Color=RGB(255,0,0); else Game->Canvas->Pen->Color=RGB(0,0,255);
      Game->Canvas->Ellipse(CreaturePos[2].x,CreaturePos[2].y,CreaturePos[2].x-4,CreaturePos[2].y-4); }


if(Player==1) - если мы сервер if(Player==2) - если мы клиент
CreaturePos[1] - координаты ваших точек
CreaturePos[2] - координаты того кто на другой стороне коннекта

Вот передача
 
Код:
if(ServerSocket1->Active==true){
    if(ServerSocket1->Socket->ActiveConnections>0)
     for(int i=0;i<100;i++)
      if(CreaturePos[1].x>-30)
       ServerSocket1->Socket->Connections[0]->SendBuf(&CreaturePos[1],sizeof(TPoint)); }
   else
     for(int i=0;i<100;i++)
      if(CreaturePos[1].x>-30)
       ClientSocket1->Socket->SendBuf(&CreaturePos[1],sizeof(TPoint));


Вот приём
Код:
void __fastcall TGamePoints::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  for(int i=1;i<100;i++)
    Socket->ReceiveBuf(&CreaturePos[2],sizeof(TPoint));
}
//---------------------------------------------------------------------------

void __fastcall TGamePoints::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
  for(int i=1;i<100;i++)
    Socket->ReceiveBuf(&CreaturePos[2],sizeof(TPoint));
}

Оставляет следы в смысле......Если что-нибудь выделить в паинте , зажать shift и потянуть быстро....Вот, точнее описать не могу.
11
23 ноября 2010 года
oxotnik333
2.9K / / 03.08.2007
имхо, проблема не в клиент-сервере а в отрисовке
да, и 10мс. вряд ли от винды можно добиться
55K
23 ноября 2010 года
Frio
25 / / 26.08.2010
Я просто не имею ни малейшего представления что можно поменять в прорисовке что бы такого не было. Там вроде и так легче некуда да и свиду проблем не должно возникать =\
33K
23 ноября 2010 года
hivewarrior
205 / / 16.11.2010
А таймер, конечно же, который берется как VCL компонент. Он генерирует сообщение, которое помещается в очередь, и когда оно будет обработано одному только Биллу известно. То есть фактически у тебя 6-7 сообщений будут обрабатываться одновременно, что ты и воспринимаешь как кучу точек.
Поставь таймер где-то 100-500 мс. или работай со временем на низком уровне через АПИ непосредственно в цикле программы.
55K
23 ноября 2010 года
Frio
25 / / 26.08.2010
Если бы я ещё знал что за АПИ......100-500 мс врядли подойдёт.....потому что оно должно происходить как бэ в реальном времени а не раз в пол секунды.
33K
23 ноября 2010 года
hivewarrior
205 / / 16.11.2010
В обаботчик кнопки засунь бесконечный цикл, в нем еще один пустой цикл с проверкой на время. В теле главного цикла нужно оставить лазейку для системных сообщений, например.
Цитата:

Если бы я ещё знал что за АПИ......100-500 мс врядли подойдёт.....потому что оно должно происходить как бэ в реальном времени а не раз в пол секунды.


GetTickCount, например. Возвращает количество тиков после старта системы.

55K
23 ноября 2010 года
Frio
25 / / 26.08.2010
Тоесть я так понял делать не по таймеру а по беконечному циклу ? И не совсем понял что значит с проверкой на время ? Можешь немного подробнее описать ? 17 лет я ещё не так быстро схватываю наверное (
33K
23 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Организация приложения Windows
Почитай о структуре приложения, поможет пониманию дела.
Проблема в Билдере в том, что нам сложно влезать в цикл приложения, поэтому придется делать свой искуственно, а там уже творить свои темные дела.:rolleyes:
А проверка на время - это проверка на время. Смотрим старое время, смотрим новое. Если не прошел положенный срок, то повисим в бесконечном цикле, например.
55K
23 ноября 2010 года
Frio
25 / / 26.08.2010
Я немного не об этом.....Я к тому , как мне может помочь бесконечный цикл с отслеживанием времени ?....Что мне вообщем это даёт ?
33K
23 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Загляни по ссылке и внимательно прочитай :)
55K
23 ноября 2010 года
Frio
25 / / 26.08.2010
Всё равно не понимаю как оно может помочь решить мою проблему (
6.0K
24 ноября 2010 года
artyom-tyanutov
107 / / 10.07.2006
Цитата: Frio
Всё равно не понимаю как оно может помочь решить мою проблему (



Что мешает в цикле сверять текущее время и время прошлого события?
В простейшем случае выглядеть будет примерно так

Код:
#include <iostream>
#include <time.h>

void printdt(clock_t dt)
{
    std::cout << dt << std::endl;
}

int main(int argc, char* argv[])
{
    clock_t needed_dtime = CLOCKS_PER_SEC / 10; //100 ms

    clock_t t = clock();
   
    for(;;){
        clock_t dt = clock() - t;
        if(dt > needed_dtime){
            printdt(dt);
            t = clock();
        }
    }

  return 0;
}


http://cplusplus.com/reference/clibrary/ctime/clock/
55K
06 декабря 2010 года
Frio
25 / / 26.08.2010
Может ли помочь winsock2 ?? Щас начал читать...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог