T
tp168
Unregistered / Unconfirmed
GUEST, unregistred user!
我现正在编写一个程序,实现类似oicq的功能:
服务端程序中有一个动态数组UList,表示当前在线用户的信息,一个用户
同时只能登陆一次,如果后一个用户登陆时发现在在线用户信息表中
发现该用户ID,将发消息至前一用户让其退出(客户端程序有处理该消息)。
type
TUserInfo = record
code:string[5];
//用户ID
nick:string[12];
//呢称
ip:string[15];
port:integer;
status:char;
//状态
...
end
var
UList:array of TUserInfo;
我实现的具体思路是每接收到用户的一个请求,就建立线程在后台处理该
消息(因为这时有访问数据库的操作),同一时刻最多建立15个线程,后续
的客户请求放入消息队列中等待有空闲的线程可处理响应。
关键是用户请求登陆时我需遍历UList数组,查找该用户有没存在,如果不存
在,再遍历UList数组一次,查找UList.port=0的位置,如果找到,就选择
该位置记录该用户信息(问题1.如果不同的线程一起找到该位置该怎么办;问
题2.如果不同的线程找到不同的位置那不是在数组UList中,uin不是唯一键值)
如果没找到该位置,就SetLength(UList,Length(UList)+1)增加一维。
如果存在(假设该用户在UList的第i维找到),发送强制退出消息至UList.ip
、UList.port后,改变UList的内容(用当前登陆用户的信息改写,你们也
许会问如果前一个用户没收到怎么办,没关系,前一个用户就什么事也做不了,
因为服务器没有它登陆的在线信息)。用户请求退出时,我查找到UList中记录该
用户信息的位置,由于记录用户信息使用动态数组,数组做删除记录比较麻烦,
如果在中间删除,要移动它后面的数据,所以不做删除,只做如下操作:
UList.port:=0;UList.ip:='';(当UList中的port=0时表示该维可用来记录
后续登陆用户的信息)。
还有一个问题,我的程序中还有一个数组表示当前的活动线程:
CList:array of TEchoThread;(TEchoThread是程序中的响应线程)
i:=GetRestThread;(取得当前非活动线程位置)
CList:=TEchoThread.create(...);
function GetRestThread:byte;
var
i:integer;
begin
For i:=Low(CList) to High(CList)do
if CList已经关闭 then
begin
CList:=;
//置为非空闲状态
Result:=i;
Exit;
//CList已经关闭和置为非空闲状态该怎么写???
end;
Result:=0;
end;
望各位高手给于帮助,或给个思路在线程中该怎么同一访问、删除、增加动态数组
UList(不用Synchronize,我知道可以用临界区、互斥元,怎么用),多谢了。
服务端程序中有一个动态数组UList,表示当前在线用户的信息,一个用户
同时只能登陆一次,如果后一个用户登陆时发现在在线用户信息表中
发现该用户ID,将发消息至前一用户让其退出(客户端程序有处理该消息)。
type
TUserInfo = record
code:string[5];
//用户ID
nick:string[12];
//呢称
ip:string[15];
port:integer;
status:char;
//状态
...
end
var
UList:array of TUserInfo;
我实现的具体思路是每接收到用户的一个请求,就建立线程在后台处理该
消息(因为这时有访问数据库的操作),同一时刻最多建立15个线程,后续
的客户请求放入消息队列中等待有空闲的线程可处理响应。
关键是用户请求登陆时我需遍历UList数组,查找该用户有没存在,如果不存
在,再遍历UList数组一次,查找UList.port=0的位置,如果找到,就选择
该位置记录该用户信息(问题1.如果不同的线程一起找到该位置该怎么办;问
题2.如果不同的线程找到不同的位置那不是在数组UList中,uin不是唯一键值)
如果没找到该位置,就SetLength(UList,Length(UList)+1)增加一维。
如果存在(假设该用户在UList的第i维找到),发送强制退出消息至UList.ip
、UList.port后,改变UList的内容(用当前登陆用户的信息改写,你们也
许会问如果前一个用户没收到怎么办,没关系,前一个用户就什么事也做不了,
因为服务器没有它登陆的在线信息)。用户请求退出时,我查找到UList中记录该
用户信息的位置,由于记录用户信息使用动态数组,数组做删除记录比较麻烦,
如果在中间删除,要移动它后面的数据,所以不做删除,只做如下操作:
UList.port:=0;UList.ip:='';(当UList中的port=0时表示该维可用来记录
后续登陆用户的信息)。
还有一个问题,我的程序中还有一个数组表示当前的活动线程:
CList:array of TEchoThread;(TEchoThread是程序中的响应线程)
i:=GetRestThread;(取得当前非活动线程位置)
CList:=TEchoThread.create(...);
function GetRestThread:byte;
var
i:integer;
begin
For i:=Low(CList) to High(CList)do
if CList已经关闭 then
begin
CList:=;
//置为非空闲状态
Result:=i;
Exit;
//CList已经关闭和置为非空闲状态该怎么写???
end;
Result:=0;
end;
望各位高手给于帮助,或给个思路在线程中该怎么同一访问、删除、增加动态数组
UList(不用Synchronize,我知道可以用临界区、互斥元,怎么用),多谢了。