-
таймер здесь не нужен.
даже для таких странных желаний, что присходят у тебя в онтаймере.
-
вот зачем апдейтить чей-то XXX по таймеру значениями из его TMyData?
этих изменений может и не быть, однако же лочится средлист и делается принудительный апдейт всех.
у тебя процессору делать нечего или в комнате холодно и ты так греешся?
-
согласен, что могу по событию клиента писать в базу данных чтолибо, переделаю, мне нужно, чтобы я на сервере видел, кто сейчас на связи из клиентов, убираю весь код из таймера кроме вывода списка клиентов в листбокс... все равно не работает
-
коннектимся под моим ником... 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;
-
мне нужно, чтобы я на сервере видел, кто сейчас на связи из клиентов
для этого есть список клиентов и есть онконнект и ондисконнект.
таймер здесь лишний
-
коннектимся под моим ником... gekanaz, в листбокс добавляется имя по таймеру...
отключаемся... в листбоксе меняется надпись на "off gekanaz"
цепляемся под другим ником... Dima... в лисбоксе ничего не меняется... count =1
затем отключаемся и только после этого видим "off Dima"
убери таймер.
-
то есть вы предлагаете по онконнекту в свою структуру данных добавлять нового клиента,,, а по дисконнекту его оттуда удалять ?? да еще и потокобезопасно... зачем изобретать велосипед, когда список уже есть у компонента TIDCMDTCPServer.
-
таймер убери.
-
если просто убрать таймер, тогда получится что два клиента одновременно могут коннектиться.. а листбокс это потоконебезопасный класс... и будет не гуд
-
убери таймер.
а потокобезопасность решается через сендмессадж.
-
Зато TThreadList потокобезопасный. И про какой протокол речь?
-
протокол самописный, экземпляр TThreadList я создам и буду туда при коннекте и дисконнекте добавлять и удалять оттуда юзеров... но непонятно зачем его писать если он есть в LockList-e
-
LockList это не лист а метод
-
это метод, с помощью которого я могу получить список активных клиентов ?? или нет.. это уже просто дело принципа.. разобраться.. то как это сделать
-
если дело принципа - то в одиночку.
а здесь обычно помогают в разработке.
-
Понял, спасибо за помощь, просто непонятно, зачем он тогда нужен :)
-
> убираю весь код из таймера
Вместе с таймером, который нафих не нужен. Ни с какого боку не нужен.
Тебе надо посмотреть в произвольный момент времени кто у тебя онлайн и под каким соусом ?
Пройдись по списку контекстов, отбрасывая элементов Connection.Connected = False, бери свое св-во Data для каждого элемента - вот тебе и список активных клиентов.
-
> это метод, с помощью которого я могу получить список активных
> клиентов ?
Это функуиональный метод, блокирующий доступ к списку активных контекстов (а не клиентов !!!!) со стороны других нитей сервера и возвращающий ссылку на этот список.
-
> Пройдись по списку контекстов, отбрасывая элементов 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;
вот это я и пытался сделать... или тут есть ошибка ?
-
> тут есть ошибка ?
Тут ошибки нет.