Конференция "Сети" » список активных клиентов (Indy) [D7, WinXP]
 
  • Медвежонок Пятачок © (13.10.11 11:14) [40]
    таймер здесь не нужен.
    даже для таких странных желаний, что присходят у тебя в онтаймере.
  • Медвежонок Пятачок © (13.10.11 11:21) [41]
    вот зачем апдейтить чей-то XXX по таймеру значениями из его TMyData?

    этих изменений может и не быть, однако же лочится средлист и делается принудительный апдейт всех.

    у тебя процессору делать нечего или в комнате холодно и ты так греешся?
  • GekaNaz (13.10.11 11:29) [42]
    согласен, что могу по событию клиента писать в базу данных чтолибо, переделаю, мне нужно, чтобы я на сервере видел, кто сейчас на связи из клиентов, убираю весь код из таймера кроме вывода списка клиентов в листбокс... все равно не работает
  • GekaNaz (13.10.11 11:36) [43]
    коннектимся под моим ником... gekanaz,  в листбокс добавляется имя по таймеру...
    отключаемся... в листбоксе меняется надпись на "off gekanaz"
    цепляемся под другим ником... Dima...   в лисбоксе ничего не меняется... count =1
    затем отключаемся и только после этого видим "off Dima"

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    lb1.items.Clear;
    if serv.Contexts <> nil then
    with serv.Contexts.LockList do try
    begin
      label1.Caption:=inttostr(count);  //здесь на форме смотрю сколько активных юзеров сейчас
     if count>0 then
    for i:=0 to count-1 do
    begin
      if TIdContext(Items[i]).Connection.Connected then
             lb1.Items.Add(TMyData(TIdContext(Items[i]).Data).name+' '+inttostr(q.params[0].asinteger))
       else lb1.Items.Add('off '+TMyData(TIdContext(Items[i]).Data).name+' '+inttostr(q.params[0].asinteger));
    end;
    end;
    finally
      serv.Contexts.UnlockList;
    end;
    end;
  • Медвежонок Пятачок © (13.10.11 11:40) [44]
    мне нужно, чтобы я на сервере видел, кто сейчас на связи из клиентов

    для этого есть список клиентов и есть онконнект и ондисконнект.
    таймер здесь лишний
  • Медвежонок Пятачок © (13.10.11 11:41) [45]
    коннектимся под моим ником... gekanaz,  в листбокс добавляется имя по таймеру...
    отключаемся... в листбоксе меняется надпись на "off gekanaz"
    цепляемся под другим ником... Dima...   в лисбоксе ничего не меняется... count =1
    затем отключаемся и только после этого видим "off Dima"


    убери таймер.
  • GekaNaz (13.10.11 11:46) [46]
    то есть вы предлагаете по онконнекту в свою структуру данных добавлять нового клиента,,, а по дисконнекту его оттуда удалять ?? да еще и потокобезопасно... зачем изобретать велосипед, когда список уже есть у компонента TIDCMDTCPServer.
  • Медвежонок Пятачок © (13.10.11 11:47) [47]
    таймер убери.
  • GekaNaz (13.10.11 11:48) [48]
    если просто убрать таймер, тогда получится что два клиента одновременно могут коннектиться.. а листбокс это потоконебезопасный класс... и будет не гуд
  • Медвежонок Пятачок © (13.10.11 11:57) [49]
    убери таймер.
    а потокобезопасность решается через сендмессадж.
  • Anatoly Podgoretsky © (13.10.11 12:02) [50]
    Зато TThreadList потокобезопасный. И про какой протокол речь?
  • GekaNaz (13.10.11 12:06) [51]
    протокол самописный, экземпляр  TThreadList я создам и буду туда при коннекте и дисконнекте  добавлять и удалять оттуда юзеров... но непонятно зачем его писать если он есть в LockList-e
  • Медвежонок Пятачок © (13.10.11 12:08) [52]
    LockList это не лист а метод
  • GekaNaz (13.10.11 12:14) [53]
    это метод, с помощью которого я могу получить список активных клиентов ?? или нет.. это уже просто дело принципа.. разобраться.. то как это сделать
  • Медвежонок Пятачок © (13.10.11 12:20) [54]
    если дело принципа - то в одиночку.
    а здесь обычно помогают в разработке.
  • GekaNaz (13.10.11 12:22) [55]
    Понял, спасибо за помощь, просто непонятно, зачем он тогда нужен :)
  • Сергей М. © (13.10.11 12:23) [56]

    > убираю весь код из таймера


    Вместе с таймером, который нафих не нужен. Ни с какого боку не нужен.

    Тебе надо посмотреть в произвольный момент времени кто у тебя онлайн и под каким соусом ?

    Пройдись по списку контекстов, отбрасывая элементов Connection.Connected = False, бери свое св-во Data для каждого элемента - вот тебе и список активных клиентов.
  • Сергей М. © (13.10.11 12:26) [57]

    > это метод, с помощью которого я могу получить список активных
    > клиентов ?


    Это функуиональный метод, блокирующий доступ к списку активных контекстов (а не клиентов !!!!) со стороны других нитей сервера и возвращающий ссылку на этот список.
  • GekaNaz (13.10.11 12:49) [58]

    > Пройдись по списку контекстов, отбрасывая элементов Connection.
    > Connected = False, бери свое св-во Data для каждого элемента
    > - вот тебе и список активных клиентов.
    >

    with serv.Contexts.LockList do try
    for i:=0 to count-1 do
    begin
     if TIdContext(Items[i]).Connection.Connected then
            lb1.Items.Add(TMyData(TIdContext(Items[i]).Data).name)
    end;
    finally serv.Contexts.UnlockList; end;

    вот это я и пытался сделать... или тут есть ошибка ?
  • Сергей М. © (13.10.11 12:58) [59]

    > тут есть ошибка ?


    Тут ошибки нет.
 
Конференция "Сети" » список активных клиентов (Indy) [D7, WinXP]
Есть новые Нет новых   [134436   +21][b:0][p:0.001]