Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2012, 13:33   #1
Maalik
Новичок
Джуниор
 
Регистрация: 17.12.2012
Сообщений: 1
По умолчанию Не работает Synchronize

Доброе время суток, уважаемые господа. Вот уже битый час не могу сделать теннис по сети, не работает synchronize и всё. Поиском пользовался такой беды не нашёл. Вчера код работал, сегодня просыпаюсь - не работает. Это проклятье.

Проблема у меня такая. Запускаю игру, создаю сервер. и посылаю команды на сервер, после посылки команды HI всё у меня накрывается медным тазом.

Я думаю synchronize, портачит. Потому-что я дебагером проверял, в переменую

Form1.server_line_to_add := 'К нам подключается '+cl.RemoteHost+'...';
до synchronize присваивается нормальное значение, а после вообще кракозябры какието, и на этом дебагер выдаёт ошибку Access Violation, вот привожу код:


Код:
unit GameServer;

interface

uses
  SysUtils, Sockets, Classes;

type
  Server = class(TThread)
  private
    { Private declarations }
  protected

    line_to_add:String;

    procedure Accept(Sender : TObject; cl : TCustomIpClient);
    procedure AddLine;
    procedure Execute; override;
   // var
  end;

implementation
uses Unit1, Unit2, Unit3, Unit4, Unit5, GameEngine;

procedure Server.AddLine;
begin
   Form2.Memo1.Lines.Add(Form1.server_line_to_add);
end;

procedure Server.Execute;
begin

   Form1.TcpServer1.LocalPort := IntToStr(game_port);
   Form1.TcpServer1.OnAccept := Accept;
   Form1.TcpServer1.Active := true;

end;

procedure Server.Accept(Sender : TObject; cl : TCustomIpClient);
var
recv : String;
begin

  game_status := GS_LISTEN;
  Form1.server_client := cl;
  cl.Sendln('CONNECTED');

  while cl.Connected and cl.WaitForData(60000) do
  begin

    recv := cl.Receiveln();

    if (recv = 'HI') and (game_status = GS_LISTEN) then
    begin
       game_status := GS_CONNECTED;
       cl.Sendln('HI');

/// ВОТ ТУТ ЭТА БЕДА
       Form1.server_line_to_add := 'Ê íàì ïîäêëþ÷àåòñÿ '+cl.RemoteHost+'...';

       Synchronize(AddLine);
    end
    else
    if (game_status = GS_CONNECTED) then
    begin
        game_remote_username := recv;
        cl.Sendln(game_username);
        game_status := GS_PREPARE;
        Synchronize(Form2.Hide);
        Synchronize(Form3.Show);  
    end
    else
    if (recv = 'START') then
    begin
        if game_status = GS_PREPARE then
        begin
            cl.Sendln('NO');
        end
        else
        if game_status = GS_STARTED then
        begin
            // ÑÒÀÐÒ ÈÃÐÛ
            cl.Sendln('YES');
            Synchronize(Form4.Show);
        end
        else
        begin
            cl.Sendln('ERROR');
        end;
    end
    else
    if (game_status = GS_STARTED) then
    begin
            


            try
            remoteplatf_x := StrToInt(recv);

            except

                cl.Sendln('ERROR');
                remoteplatf_x := 0;
                Continue;
            end;


            if (remoteplatf_x < 0) then
            begin
                remoteplatf_x := 0;
            end
            else
            if (remoteplatf_x+Form4.Shape2.Width > Form4.Panel1.Width) then
            begin
                remoteplatf_x := Form4.Panel1.Width-Form4.Shape2.Width;
            end;


            cl.Sendln(IntToStr(ball_x)+';'+
                      IntToStr(ball_y)+';'+
                      IntToStr(userplatf_x));
            game_update := true;
            

    end
    else
    if game_status = GS_GAMEOVER then
    begin
    
      if game_winner = GW_USER then
      begin
       cl.Sendln('LOSE');
       end
       else
       begin
       cl.Sendln('WIN');
       end;
       
    end
    else
    if game_status = GS_PAUSED then
        begin
            cl.Sendln('PAUSED');
        end
    else
    begin
       cl.Sendln('ERROR');
    end;

  end;

  cl.Disconnect;

  Synchronize(Form1.Hide);
  Synchronize(Form2.Show);
  Synchronize(Form3.Hide);
  Synchronize(Form4.Hide);
  Synchronize(Form5.Hide);

 Form1.server_line_to_add := 'Óïñ... Ñîåäèíåíèå ïîòåðÿíî... Ïå÷àëüêà =(';
  {Synchronize(}AddLine{)};

  Form1.TcpServer1.Active := false;

end;

end.

З.Ы. Сам проект приложил...
Вложения
Тип файла: rar maalik_game.rar (230.2 Кб, 8 просмотров)
Maalik вне форума Ответить с цитированием
Старый 17.12.2012, 14:38   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

1. Неосилил чтение кода... код как паутина переплетен
2. Зачем все формы создавать сразу?
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 17.12.2012, 17:41   #3
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Цитата:
дебагер выдаёт ошибку Access Violation
После Access Violation в сообщении об исключении обязательно присутствуют подробности.
Они для кого, по-твоему ?
xoodoo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi Потоки. работа с функцией Synchronize() griha45 Помощь студентам 1 22.11.2012 23:13
Через Synchronize не работает get bulldog5293 C++ Builder 3 14.06.2012 10:04
Synchronize() и события формы RusikOk Общие вопросы C/C++ 0 24.07.2010 08:52
Synchronize в DLL AnomaliA Общие вопросы Delphi 12 29.09.2009 13:08
Метод Synchronize класса TThread EdNovice Общие вопросы Delphi 10 01.08.2009 14:47