Форум: "Начинающим";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];
ВнизПроблема с указателями Найти похожие ветки
← →
Rembo (2008-08-17 20:39) [0]Делаю вот что:
...
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)
Подскажите плз где ошибка.
← →
Сергей М. © (2008-08-17 20:50) [1]Все объекты в Делфи представлены указателями.
Зачем тебе потребовался указатель на указатель ?
> 0..10000
Куда ты из столько наструячил ?)
Можешь считать, что тебе повезло, если тебе удалось создать всего пару тысяч потоков. А уж создать 10000 тебе никогда не удастся.
← →
Rembo (2008-08-17 20:55) [2]Ок, вопервых, я потоки не создаю, это делает TIdTcpServer, делаю чат, нехотел говорить чтоб тему не перенсли. Так вот, там на одного клиента 1 поток, и как то надо их идентифицировать, вот я и придумал хранить ник и указатель.
> Зачем тебе потребовался указатель на указатель ?
Значит ли это что AThread уже указатель на поток?
← →
Сергей М. © (2008-08-17 21:06) [3]
> я потоки не создаю, это делает TIdTcpServer
А зачем тогда тебе этот массив ?
IdTcpServer имеет св-во Threads.
Но в любом случае создание 10000 потоков невозможно.
> и как то надо их идентифицировать
IdPeerThread имеет св-во Data, где можно хранить указатель на данные, предназначенный для идентификации объекта-потока.
> Значит ли это что AThread уже указатель на поток?
Да.
← →
DVM © (2008-08-17 21:13) [4]
> Rembo (17.08.08 20:55) [2]
Инди в данном случае выбор не лучший. На одного подключенного клиента будет расходоваться в лучшем случае 1-1.5 мегабайта памяти.
← →
Rembo (2008-08-17 21:31) [5]Ага кажись понял, массив ненужен.
DVM а почему так много и что лучше для чата юзать?
← →
DVM © (2008-08-17 21:49) [6]
> DVM а почему так много
Примерно столько надо системе для поддержания работы 1 потока, если не ошибаюсь.
> и что лучше для чата юзать?
MS утверждает, что самое лучшее в таких случаях асинхронные неблокирующие сокеты, например, с уведомлениях на сообщениях.
Так как инди по природе блокирующие сокеты, то может их стоит заменить на библиотеку ICS или самому попробовать сделать сервер средствами WinSock
← →
Rembo (2008-08-18 01:53) [7]А как насчет TIdUDP???
Оно ж вроде потоки несоздает ваще?
← →
Сергей М. © (2008-08-18 08:15) [8]
> DVM © (17.08.08 21:49) [6]
> если не ошибаюсь
Ошибаешься.
Сколько системе скажут, столько она и выделит под стек потока.
А если не скажут, то по дифолту 1 мб выделит.
TThread как раз не говорит.
> Rembo (18.08.08 01:53) [7]
>
> Оно ж вроде потоки несоздает ваще?
А тебе они, потоки эти, зачем ?
← →
Alucard (2008-08-19 01:31) [9]Самый быстрый (и удобный) способ обслуживания большого количества одновременных соединений в windows (и вообще асинхронного ввода-вывода), это completion ports. http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx.
Контексты пользователей, в свою очередь, можно поддерживать в более производительных структурах данных чем массивы указателей, например в хэшмапах.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.045 c