摘要:
1.TCP/IP心跳包,XE2 DATASNAP本身已内置,设置几个属性就可以,这个经过了测试。不再需要像DELPHI 2010 DATASNAP那样要自己写代码来处理。2.XE2 DATASNAP内置的线程池是使用的INDY10的线程池。INDY10是阻塞+多线程的通讯控件。实际测试当中发现DATASNAP是一个客户连接对应一个线程,一直到客户连接断开线程才归还线程池中,就算一个客户连接以后啥事也不干,也要一直地占用服务端一个线程对象。有多少个连接客户,服务端就要开启多少个线程。如果客户数量比较多的话,这样是很没有效率的。开启的线程较多,CPU的时间都花在线程的上下文切换上面。所以在大量并发 阅读全文
摘要:
program Monitor;// {$APPTYPE CONSOLE}uses Winapi.Windows, System.SysUtils, ProcLib in 'ProcLib.pas';var Mutex: HWND;const c_AppName = 'server.exe';begin Mutex := Winapi.Windows.CreateMutex(nil, False, 'Monitor'); if (GetLastError = ERROR_ALREADY_EXISTS) or (Mutex = 0) then Ex 阅读全文
摘要:
unit uDBJson;interface{$HINTS OFF}uses SysUtils, Classes, Variants, DB, DBClient, SuperObject;type TTableJSon = class private const cstFieldType = 'FieldType'; const cstFieldName = 'FieldName'; const cstFieldSize = 'FieldSize'; const cstJsonType = 'JsonType'; const cs 阅读全文
摘要:
unit untMemoryPool;interface{$WARNINGS OFF}uses System.Classes, System.SysUtils, Winapi.Windows;type //Node for block memory pMemNode = ^TMemNode; TMemNode = record Free : Boolean; //Is free? FSize: Integer; //Block Size FAddr: Pointer; //Address pointer to memory allocated FNext: pMemNode; //Next b 阅读全文
摘要:
function CnPYIndex(const CnString: string): string;{ 返回中文的拼音首字母}const ChinaCode: array[0..25, 0..1] of Integer = ((1601, 1636), (1637, 1832), (1833, 2077), (2078, 2273), (2274, 2301), (2302, 2432), (2433, 2593), (2594, 2786), (9999, 0000), (2787, 3105), (3106, 3211), (3212, 3471), (3472, 3634), (363 阅读全文
摘要:
最小化到任务栏postmessage(Self.Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);最大化或还原procedure Tf_MainForm.RzToolButton1Click(Sender: TObject);var abd: TAppBarData;begin inherited; if WindowState=wsnormal then begin WindowState := wsMaximized; // BorderStyleÎ为 bsNone abd.cbSize := sizeof(abd); SHAppBarMessage(ABM 阅读全文
摘要:
uses Datasnap.DSIntf设置ZLIB压缩等级(zcFastest表示最快的压缩速度) ZCompressStream(M, M0, zcFastest);获取压缩前和压缩后的数据包的体积 iTest := DataPacketSize(VarToDataPacket(aDsp[i].Data)); iB := GetTickCount; v[i] := CompressData(aDsp[i].Data); iTime := GetTickCount - iB; ShowMessage(IntToStr(iTime)); iTest := DataPacketSize(VarT 阅读全文
摘要:
1.代理服务器维护客户专用的应用服务器的表结构(此表规划了负载平衡, 每一个客户都有自己专用的应用服务器):用户编号, 用户密码, 应用服务器编号2.代理服务器维护应用服务器的表结构:应用服务器编号, 应用服务器名称, 应用服务器IP地址(域名), 应用服务器端口号3.代理服务器的IP地址和端口号必须对所有的客户端进行公开. 代理服务器必须有公网IP地址(域名). 各应用服务器也必须有公网IP地址(域名), 但只向代理服务器公开.4.代理服务器提供所有客户端调用的接口:Function GetAppServer(const UserId, Password: string): string;功 阅读全文
摘要:
其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B 另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了 同样用户B要等用户A释放表A才能继续这就死锁了解决方法: 这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法 仔细分析你程序的逻辑, 1:尽量避免同时锁定两个资源 2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源.表现二: 用户A读一条纪录,然后修改该条纪录 这是... 阅读全文