![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с указателями
Rembo © (2008-08-17 20:39:00)Делаю вот что:
...
type
PTrhead=^TIdPeerThread;
TCL = record
name:string[255];
thread:PTrhead;
end;
...
var
clients:array[0..10000] of TCL;
cc:word;
client:TCl;
...
cc:=0;
...
inc(cc);
client.thread:=@AThread;//AThread типа TIdPeerThread
clients[cc]:=client;
...
function findclient(thr:PTrhead):integer;overload;
var i:integer;
begin
result:=-1;
for i:=0 to cc-1 do begin
if clients[i].thread=thr then begin result:=i; exit; end;
end;
end;
...
Если словами то, делаю масив записей строка+указатель, потом кидаю в него одну или несколько записей с указателями на некий AThread, потом пытаюсь искать в этом массиве по указателю и ненахожу ничо(findclient(@AThread) выдает -1)
Подскажите плз где ошибка.
Alucard (2008-08-19 01:31:00) [1]Самый быстрый (и удобный) способ обслуживания большого количества одновременных соединений в windows (и вообще асинхронного ввода-вывода), это completion ports. http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx.
Контексты пользователей, в свою очередь, можно поддерживать в более производительных структурах данных чем массивы указателей, например в хэшмапах.
Сергей М. (2008-08-18 08:15:00) [2]
> DVM © (17.08.08 21:49) [6]
> если не ошибаюсь
Ошибаешься.
Сколько системе скажут, столько она и выделит под стек потока.
А если не скажут, то по дифолту 1 мб выделит.
TThread как раз не говорит.
> Rembo (18.08.08 01:53) [7]
>
> Оно ж вроде потоки несоздает ваще?
А тебе они, потоки эти, зачем ?
Rembo (2008-08-18 01:53:00) [3]А как насчет TIdUDP???
Оно ж вроде потоки несоздает ваще?
DVM (2008-08-17 21:49:00) [4]
> DVM а почему так много
Примерно столько надо системе для поддержания работы 1 потока, если не ошибаюсь.
> и что лучше для чата юзать?
MS утверждает, что самое лучшее в таких случаях асинхронные неблокирующие сокеты, например, с уведомлениях на сообщениях.
Так как инди по природе блокирующие сокеты, то может их стоит заменить на библиотеку ICS или самому попробовать сделать сервер средствами WinSock
Rembo (2008-08-17 21:31:00) [5]Ага кажись понял, массив ненужен.
DVM а почему так много и что лучше для чата юзать?
DVM (2008-08-17 21:13:00) [6]
> Rembo (17.08.08 20:55) [2]
Инди в данном случае выбор не лучший. На одного подключенного клиента будет расходоваться в лучшем случае 1-1.5 мегабайта памяти.
Сергей М. (2008-08-17 21:06:00) [7]
> я потоки не создаю, это делает TIdTcpServer
А зачем тогда тебе этот массив ?
IdTcpServer имеет св-во Threads.
Но в любом случае создание 10000 потоков невозможно.
> и как то надо их идентифицировать
IdPeerThread имеет св-во Data, где можно хранить указатель на данные, предназначенный для идентификации объекта-потока.
> Значит ли это что AThread уже указатель на поток?
Да.
Rembo (2008-08-17 20:55:00) [8]Ок, вопервых, я потоки не создаю, это делает TIdTcpServer, делаю чат, нехотел говорить чтоб тему не перенсли. Так вот, там на одного клиента 1 поток, и как то надо их идентифицировать, вот я и придумал хранить ник и указатель.
> Зачем тебе потребовался указатель на указатель ?
Значит ли это что AThread ужеуказатель на поток?
Сергей М. (2008-08-17 20:50:00) [9]Все объекты в Делфи представлены указателями.
Зачем тебе потребовался указатель на указатель ?
> 0.. 10000
Куда ты из столько наструячил ?)
Можешь считать, что тебе повезло, если тебе удалось создать всего пару тысяч потоков. А уж создать 10000 тебе никогда не удастся.