【更新说明】 默认情况下,QMacros 支持的宏定义是包含在开始和结束字符之间的一串内容,如 [MacroName] 。但有些时候,我们的宏可能只有开始符而没有结束符,而是靠标志符的规则来控制宏名称的结束。如下面带参数的 SQL 语句:
1 |
select * from mytable where id>:id and age<:age |
其规则就是以
【更新说明】 默认情况下,QMacros 支持的宏定义是包含在开始和结束字符之间的一串内容,如 [MacroName] 。但有些时候,我们的宏可能只有开始符而没有结束符,而是靠标志符的规则来控制宏名称的结束。如下面带参数的 SQL 语句:
1 |
select * from mytable where id>:id and age<:age |
其规则就是以
还是挺简单的,配置后,外部访问就可以通过你的域名来直接访问了,端口号对外隐藏,工作起来就象真正的独立主机一样。myservers 我直接用的网站域名。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
upstream myservers { ip_hash; server 192.168.8.9:81;#服务器地址和端口号,多个服务器就加多条记录,可以通过weight参数做负载均衡 } #定义服务器的代理 server { #普通配置部分省略 location / { proxy_pass http://myservers/;#指定内部通过myservers 服务器组进行负载均衡,实际上就上让nginx从上面的upstream的服务器列表中选择一个服务器 } } |
QDAC.QDB 的 PostgreSQL 直连模块目前已经完成了70%左右功能的开发,所以就做了一个与其它能够连接 PostgreSQL 数据库的组件的性能对比测试,结果如下: 连接初始化的时间我没有进行统计,我们测试 QDAC、UniDAC、FireDAC 三者执行相同脚本所有的时间,以观察其相应的效率对比,为了将
转自不得闲在cnblog的博客:Delphi Android程序启动过程 Delphi的Android程序是原生的程序,也就是NativeActivity。那么就需要先看一下NativeActivity的原理, 在AndroidManifest.xml文件里面指定入口activity为nativeactivity,这
【问题描述】 该问题是由于 IndexOf 函数没有跟着修改造成的,KeyAsInteger 等函数名称不是以原来的字符串结果存贮,所以造成此问题。 【严重程度】 高 【更新级别】 可选 【特别感谢】 空号
来自网友天地弦的DIOCP早已经广为人知了,有很多的同学都用上了它,甚至各种变异、修改版本也出了不少。我最近也在学习DIOCP,打算将它用于自己的服务端,今天让我们来一起探密它(DIOCP)的运作核心吧。 DIOCP作为对Windows的IOCP完成端口封装,拥有了很高的性能,经过对ECHO示例的测试,它
【问题描述】 MD5 和 SHA 384 、SHA 512 在计算哈希值时,结果与其它软件计算结果不一致。 【严重程度】 中 【更新级别】 推荐 【特别感谢】 恢弘、Tuesday
有时候,我们需要排除其它进程的影响,单看自己的进程的CPU占用率,而不是整个系统的CPU占用率,那么我们该如何看呢?Windows 提供了一个 API GetProcessTimes 来获得进程的使用时间信息,我们简单封装了下提供给大家:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
type TProcessCpuUsage = record private FLastUsed, FLastTime: Int64; FCpuCount:Integer; public class function Create: TProcessCpuUsage; static; function Current: Single; end; var ProcessCpuUsage: TProcessCpuUsage = (FLastUsed: 0; FLastTime: 0;FCpuCount:0); { TProcessCpuUsage } class function TProcessCpuUsage.Create: TProcessCpuUsage; begin Result.FLastTime := 0; Result.FLastUsed := 0; Result.FCpuCount := 0; end; function TProcessCpuUsage.Current: Single; var Usage, ACurTime: UInt64; CreateTime, ExitTime, IdleTime, UserTime, KernelTime: TFileTime; function FileTimeToI64(const ATime: TFileTime): Int64; begin Result := (Int64(ATime.dwHighDateTime) shl 32) + ATime.dwLowDateTime; end; function GetCPUCount: Integer; var SysInfo: TSystemInfo; begin GetSystemInfo(SysInfo); Result := SysInfo.dwNumberOfProcessors; end; begin Result := 0; if GetProcessTimes(GetCurrentProcess, CreateTime, ExitTime, KernelTime, UserTime) then begin ACurTime := GetTickCount; Usage := FileTimeToI64(UserTime) + FileTimeToI64(KernelTime); if FLastTime <> 0 then Result := (Usage - FLastUsed) / (ACurTime - FLastTime) / FCpuCount / 100 else FCpuCount:=GetCpuCount; FLastUsed := Usage; FLastTime := ACurTime; end; end; |
具体用法就很简
【功能说明】 本软件用于通过自定义的脚本在两台服务器之间同步数据,支持: PostgreSQL -> PostgreSQL PostgreSQL -> MS SQL Server MS SQL Server -> PostgreSQL MS SQL Server -> MS SQL Server
Delphi 中的组件有时候编写时未考虑到C++的用户,生成的单元中的变量或宏定义与系统的发生冲突。这时候,我们可能需要用 $NOINCLUDE 来告诉编译器生成的 HPP 文件中不要包含相应的头文件,以解决冲突。比如: {$NOINCLUDE MyAPI.MyClose*} 就不会生成所有以 MyAPI.MyClos
【问题描述】 该问题是由于新修改的超时检测算法在达到 MinWorkers 这个下限时,由于并不会解雇工作者,但却忘记清掉 FTimeout 的累计值造成没有作业时阶段性CPU占用率过高。 【严重程度】 高 【更新级别】 推荐 【特别感谢】 恢弘
【注】本对比只是一个中间结果,不代表最终稳定测试版结果。连接的是官网服务器上的演示数据库,测试代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
var T1, T2: Int64; I: Integer; begin FProv.ServerHost := 'www.qdac.cc'; FProv.ServerPort := 端口号也藏掉; FProv.UserName := 'qdac'; FProv.Password := '这块密码藏掉了'; FProv.Database := 'QDAC_Demo'; try FProv.Open; UniConnection1.Open; T1 := GetTickCount; FProv.OpenDataSet(FDataSet, 'select * from information_schema.tables'); // T1 := GetTickCount - T1; T2 := GetTickCount; UniQuery1.SQL.Text := 'select * from information_schema.tables'; UniQuery1.Open; T2 := GetTickCount - T2; if FDataSet.Active then begin Memo1.Lines.Add('数据集打开成功,返回:' + IntToStr(FDataSet.RecordCount) + '条记录'); end; Memo1.Lines.Add('QDAC:' + IntToStr(T1) + 'ms'); Memo1.Lines.Add('UniDAC:' + IntToStr(T2) + 'ms'); finally for I := 0 to DBGrid1.Columns.Count - 1 do DBGrid1.Columns[I].Width := 120; if FProv.Connected then begin Memo1.Lines.Add('服务器已连接'); Memo1.Lines.AddStrings(FProv.Params); end else Memo1.Lines.Add('服务器连接失败:' + FProv.LastErrorMsg); end; |
最终的测试结果速度要快于UniDAC,下面是其中一次的测试结果,约快一倍左右。
在 FMX 中,要实现多页面滑动效果,实际上很简单,不需特别复杂的代码。下面列出了作者的一些实现的一些步骤: 1、由于对于默认的 Tab 显示方式不喜欢,作者决定自己实现一个 Tab, 这个 Tab 只显示上一页、当前和下一页的 Tab 标题,我们为此在页面首部放置了一个 Panel ,左右各有一个 SpeedButt
下面的代码在 XE7 或 XE8 中测试通过,命中率 100%。
1 2 3 4 |
if(!1) { //这里你随便整点啥 } |
编译项目,然后美好的事情就此发生了! 这个 Bug 俺竟然已经无言以对。来个动画:
QMacros 做为一个模板替换库,拥有良好的属性。结合合适的策略,可以很好的完成复杂的功能。 我们下面的这个例子,试图基于 QMacros 模板生成一个SQL批量插入脚本,首先我们来看下模板定义:
1 |
insert into mytable(Id,Name,Age,Sex,Scale,Comment) values ([Id.Quoted],[Name.Quoted],[Age],[Sex],[Scale],[Comment.Quoted]); |
这个是我们生成一个简单 SQL 的模板定义,模板中宏以
自家产的绿茶,纯炒青,绝不掺杂大棚茶和任何添加剂,包装规格为每袋 125g,生产日期为2015年4月17日,价格240元,现有少量存货,有需要者请与我联系,或者直接访问 淘宝订购链接 : http://item.taobao.com/item.htm?spm=0.0.0.0.QXRDbM&id=44715578
想必玩安卓的童鞋大多都知道,安卓的APK安装包是可以反编译出源代码的,如果开发人员发布时没有对其混淆等加密处理,反编译出来的代码几乎与真实的源代码一模一样。 想要反编译apk,需要用到apktool.jar,目前它已经更新了到了apktool_2.0.0rc6了。apktool.jar通过命令行即可反编译apk,而且网
麦子仲肥写了一个很好的编译辅助工具,我将其做了一些简单的改进,支持更多的命令行参数,然后可以直接调试运行生成 HTML 格式的报告。 新增的命令行参数有: /I 后跟源码路径列表 /SID 后跟会话编码,用一唯一标记一次编译 /M 后跟源码文件掩码 /O 后跟目标路径 /C 后跟编译预配置文件 /Q 编译完成后退出程序
这个函数是抄自 JCL 的 IsAdministrator,我把它改成了 C++ 的版本,好象没有什么可说的,就这样吧,感谢 Jedi Project。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
bool __fastcall IsAdministrator() { DWORD RelativeGroupID = DOMAIN_ALIAS_RID_ADMINS; void * psidAdmin; HANDLE Token; DWORD Count; PTokenGroups TokenInfo; bool HaveToken; OSVERSIONINFO ov; SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; ov.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&ov); if (ov.dwPlatformId != VER_PLATFORM_WIN32_NT) { return true; } psidAdmin = NULL; TokenInfo = NULL; HaveToken = false; try { Token = 0; HaveToken = OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, True, &Token); if ((!HaveToken) && (GetLastError() == ERROR_NO_TOKEN)) { HaveToken = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &Token); } if (HaveToken) { if (!AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, RelativeGroupID, 0, 0, 0, 0, 0, 0, &psidAdmin)) { return false; } } else { ShowMessage(SysErrorMessage(GetLastError())); return false; } if (GetTokenInformation(Token, TokenGroups, NULL, 0, &Count) || (GetLastError() != ERROR_INSUFFICIENT_BUFFER)) { return false; } TokenInfo = (PTokenGroups)AllocMem(Count); if (!GetTokenInformation(Token, TokenGroups, TokenInfo, Count, &Count)) { return false; } for (DWORD I = 0; I < TokenInfo->GroupCount; I++) { if (EqualSid(psidAdmin, TokenInfo->Groups[I].Sid)) { // consider denied ACE with Administrator SID return (TokenInfo->Groups[I] .Attributes & SE_GROUP_USE_FOR_DENY_ONLY) != SE_GROUP_USE_FOR_DENY_ONLY; } } } __finally { if (TokenInfo) { FreeMemory(TokenInfo); } if (HaveToken) { CloseHandle(Token); } if (psidAdmin) { FreeSid(psidAdmin); } } return false; } |
1、FireMonkey 在创建子视图时,主视图所有的控件必需已经命名,如果你的控件没有命名,XE8 会弹出下面的错误: Cannot inherit from form ‘FormName”. It contains a component with a blank name property
登录 |