Mirror docs/tsl/codegen into the bundled tsl-api-reference skill and rebuild the function index. Remove invalid duplicate API entries for cb_delistedbydate, createhttpsession, exportJsonString, and Anova_Bartlett so exact lookup returns the canonical entries.
26 KiB
Builtin - 资源 / 进程
sleep(milliseconds)
暂停执行。
| 参数 | 类型 | 说明 |
|---|---|---|
milliseconds |
integer | 整数,需要暂停的毫秒数。例如暂停一秒为Sleep(1000)。 |
返回:nil
示例
// 以下代码先打印123,接着回暂停2S,然后接着打印456
echo 123;
sleep(2000);
echo 456;
sysParamStr(index)
获得命令行的指定索引的参数值。
| 参数 | 类型 | 说明 |
|---|---|---|
index |
整数,命令行参数的索引号。Index=0,返回值为当前天软脚本文件名称;Index>0,返回值为额外传入的命令行参数值(字符串类型) |
返回:string
示例
// 本地test.tsl文件中代码如下:
test();
function test();
begin
r := array();
for i := 1 to sysParamcount() do
begin
echo sysParamStr(i), '\r\n';
end
end
// 在cmd中打开文件所在文件夹,输入命令:tsl test.tsl 1 2 3
sysReleaseMutex(mutex)
释放一个互斥锁。
| 参数 | 类型 | 说明 |
|---|---|---|
mutex |
integer | 整数,互斥锁编号 |
返回:bool
示例
// 释放互斥锁,参数为创建互斥锁时返回的互斥锁编号
ret := rdo2 sysCreateMutex("tinysoft");
ret1 := rdo2 sysReleaseMutex(ret);
return ret1;
// 结果:1
sysexecnewpipe(flag)
创建Sysexec进程的管道。参数缺省时,默认创建读写管道。创建之后会与第一次被用的进程进行绑定,当有多个Sysexec进程时,可以创建多个管道分别进行读写操作。
| 参数 | 类型 | 说明 |
|---|---|---|
flag |
integer | 整数,可选参数,控制创建管道的读写属性。Flag转换为二进制时,第0位表示是否可读,第1位表示是否可写。即 |
返回:bool
示例
// 创建读写管道
sysExecNewPipe(0);
path := "D:\\TinySoftNG\\AnalyseNG.NET\\TSL.exe";
// 非阻塞执行,返回进程句柄
hand := sysExec(path, "tsl", nil, 0, code);
// 获取SysExec进程所在管道的输出内容
t1 := "";
while t1="" do
begin
t1 := sysexecreadpipe(hand);
sleep(100); // 100毫秒读取一次
end
// 向SysExec进程所在管道写入内容
sysExecWritePipe(hand, "datetostr(today())\r\n");
sleep(500); // 等待写入的内容执行完成,也可写成上面的循环的方式获取
// 获取管道执行写入内容后的输出内容
t2 := sysexecreadpipe(hand);
t3 := sysTerminate(code, hand); // 终止进程
return array(hand, t1, t2);
// 输出:如下图:
sysexecdeletepipe(process_handle)
删除指定进程的管道。参数缺省时,删除默认管道。
| 参数 | 类型 | 说明 |
|---|---|---|
process_handle |
数值,可选参数,进程句柄。 |
返回:bool
示例
// 创建读写管道
sysExecNewPipe(0);
path := "D:\\Program Files\\Analyse.NET\\TSL.exe";
// 非阻塞执行,返回进程句柄
hand := sysExec(path, "tsl", nil, false, code);
// 获取SysExec进程所在管道的输出内容
t1 := "";
while t1="" do
begin
t1 := sysexecreadpipe(hand);
end
de_ret := sysExecDeletePipe(hand);
// 删除成功,尝试向指定进程所在管道写入内容
if de_ret then
begin
try
sysExecWritePipe(hand, " datetostr(20221130T)\r\n");
return false;
except
// 写入失败,管道删除成功
return true;
end;
end
sysTerminate(code, hand); // 终止进程
return false;
// 输出:
// 执行超时。
sysGetSubProcesses(pid)
获得进程的子进程列表
| 参数 | 类型 | 说明 |
|---|---|---|
pid |
integer | 整数,可选参数,进程ID。未指定时默认获取当前进程内的子进程列表 |
返回:array,tablearray
示例
范例01:获取当前进程的子进程列表
ret := sysGetSubProcesses();
if istabel(ret) then
return ret;
else
return "获取进程的子进程列表失败!"
范例02:获取指定进程的子进程列表
// 打开记事本,在任务管理器中查找对应进程ID:
ret := sysGetSubProcesses(2932);
if istabel(ret) then
return ret;
else
return "获取进程的子进程列表失败!"
sysGetMemoryUsage()
获取系统内存状态
返回:array,tablearray
示例
// 获得系统内存状态
return sysGetMemoryUsage();
sysGetProcessMemoryUsage(pid)
获取进程的内存使用状态
| 参数 | 类型 | 说明 |
|---|---|---|
pid |
integer | 整数,可选参数,进程ID。未指定时默认获取自身的内存使用状态 |
返回:array
示例
// 获得自身的内存使用状态
return sysGetProcessMemoryUsage();
sysLibCVersion()
获取系统中C语言支持库的版本
返回:string
示例
// 获得C语言支持库的版本
return sysLibCVersion();
// 返回:"10.0.26100.8521"
processField(field_name, call_back)
对相应的数据进行处理,注意,该函数主要用于客户端结果处理,不提供给用户程序编辑。
| 参数 | 类型 | 说明 |
|---|---|---|
field_name |
string | 字符串,字段名称 |
call_back |
string | 字符串,函数名称 |
返回:array,tablearray
processFirstField(call_back)
对相应数据进行处理。注意,该函数主要用于客户端结果处理,不提供给用户程序编辑。
| 参数 | 类型 | 说明 |
|---|---|---|
call_back |
string | 字符串,函数名称 |
返回:array,tablearray
sysputenv(env_value)
设置当前运行环境的指定环境变量的值。
| 参数 | 类型 | 说明 |
|---|---|---|
env_value |
string | 字符串,环境变量名=变量值。 |
返回:integer
示例
// 以笔者的电脑环境为例,来展示该函数的功能:
// 如图所示,本地现有名为OS的环境变量:
// 并且在powerShell等控制台中可以获取到:
// 在TSL执行环境中,我们可以使用SysGetenv函数获取指定环境变量,如下:
范例01:将原环境变量值替换为设置值。
// 从下面的截图中,可以看出,SysPutenv只能设置当前TSL运行环境的环境变量。
// 在客户端中用代码实现如下:
res := sysgetenv("OS"); // 获取本地原有环境变量OS的值
echo res; // 打印原有环境变量OS的值
ret := sysputenv("OS=Test"); // 更改当前运行环境的环境变量OS的值
if ret=0 then return sysgetenv("OS"); // 更改成功,获取更改后的环境变量OS的值
// 返回字符串“Test”
范例02:将新增值添加到原有环境变量中
// 在客户端中用代码实现如下:
res := sysgetenv("OS"); // 获取本地原有环境变量OS的值
echo res; // 打印原有环境变量OS的值
res := "OS="$res$";Test"; // 原有环境变量与设置值拼接
ret := sysputenv(res); // 更改当前运行环境的环境变量OS的值
if ret=0 then return sysgetenv("OS"); // 更改成功,获取更改后的环境变量OS的值
// 结果:返回字符串" Windows_NT;Test"
sysErrorMessage(code)
返回指定代码表示的系统错误信息。
| 参数 | 类型 | 说明 |
|---|---|---|
code |
integer | 整数,提示代码 |
返回:string
示例
return rdo2 sysErrorMessage(200);
// 结果:代码段不可大于或等于 64K。
sysgetenv(name)
获取当前运行环境下指定环境变量的值。
| 参数 | 类型 | 说明 |
|---|---|---|
name |
string | 字符串,环境变量名。 |
返回:string
示例
// 读取本地已有系统环境变量OS的值
return sysgetenv("OS");
// 返回字符串“Windows_NT”
// 注:更具体的应用可参考Sysputenv中的范例。
sysWaitForMultipleObjects(objects, b_wait_all, wait_ms)
等待占有多个对象,例如互斥对象。支持windows和linux的进程
| 参数 | 类型 | 说明 |
|---|---|---|
objects |
array of integer | 一维数字数组,对象句柄数组 |
b_wait_all |
bool | 真假,是否等待所有的对象。为真等待所有的,为假则仅需任意一个对象等待成功。 |
wait_ms |
integer | 整数,等待的毫秒数,-1则为永远等待。 |
返回:integer
示例
sysExecNewPipe(); // 创建管道
path := "D:\\TinySoftNG\\AnalyseNG.NET\\TSL.exe";
do_s1 := array('C:\\TinySoftNG\\AnalyseNG.NET\\tsl.exe', 'C:\\DoTSL\\otherTest\\TestEnv.tsl');
do_s2 := array('C:\\TinySoftNG\\AnalyseNG.NET\\tsl.exe', 'C:\\DoTSL\\otherTest\\TestEcho.tsf');
// 创建一个被挂起的进程,两个会返回的进程
hand1 := sysExec(path, 'TSL', nil, array('wait': false, 'in': 'c := "333"\r\n'), code);
hand2 := sysExec(path, do_s1, nil, false, code);
hand3 := sysExec(path, do_s2, nil, false, code);
r := sysWaitForMultipleObjects(array(hand1, hand2, hand3), 0, 10 * 1000); // 仅需任意一个对象等待成功
t := sysexecreadpipe(); // 读取管道内容
sysTerminate(code, hand1); // 终止进程
sysTerminate(code, hand2); // 终止进程
sysTerminate(code, hand3); // 终止进程
return array(r, t);
返回: 返回为1,说明hand1没有等待成功,而至少hand2是有等待成功了。注:其中的TestEnv.tsl与TestEcho.tsf实现分别如下:TestEnv.tsl: sleep(500);t := Sysgetenvs();echo "sys: ", tostn(t), '\r\n';return 1;
test_echo.tsf: sleep(2 * 1000); // 停2秒echo 'TestEchoIN\r\n';return 1;
sysCreateMutex(mutex_name)
创建一个互斥锁。
| 参数 | 类型 | 说明 |
|---|---|---|
mutex_name |
string | 字符串,互斥锁名称 |
返回:integer
示例
// 创建一个名称为tinysoft的互斥锁
ret := rdo2 sysCreateMutex("tinysoft");
return ret;
// 结果:2632
sysProcessId()
获得运行的进程ID。
返回:integer
示例
{获得天软客户端程序当前的进程ID,即在任务管理器中查看到的进程对应的PID。每个电脑的进程不一样}
return rdo2 sysProcessId();
sysParamcount()
获得命令行参数个数。(不包括执行的自身.TSL参数)
返回:integer
示例
// 本地test.tsl文件中代码如下:
test();
function test();
begin
// 获取命令行传入参数个数
echo sysParamcount();
end
// 在cmd中打开文件所在文件夹,输入命令:tsl test.tsl 1 2 3
sysThreadId()
获得运行的线程ID。
返回:integer
示例
// 获得天软客户端程序当前的进程运行的线程ID
return rdo2 sysThreadId();
sysWaitForSingleObject(object, wait_ms)
等待占有一个对象,例如互斥对象。支持windows和linux的进程
| 参数 | 类型 | 说明 |
|---|---|---|
object |
integer | 整数,对象名柄 |
wait_ms |
integer | 整数,等待的毫秒数,-1则为永远等待。 |
返回:integer
示例
sysExecNewPipe(); // 创建管道
path := "D:\\TinySoftNG\\AnalyseNG.NET\\TSL.exe";
do_s := array('C:\\TinySoftNG\\AnalyseNG.NET\\tsl.exe', 'C:\\DoTSL\\otherTest\\TestEnv.tsl');
hand1 := sysExec(path, do_s, nil, array('wait': false, 'in': 'd := "123"\r\n'), code);
r := sysWaitForSingleObject(hand1, 10 * 1000); // 等待线程的状态
t := sysexecreadpipe(); // 读取管道内容
return array(r, t);
返回: 其中,TestEnv.tsl文件的实现如下: // 当前sys的环境变量t := Sysgetenvs();echo "sys: ",tostn(t),'\r\n';s := Readln();//读取echo 'IN:',s,'\r\n';return 1;
sysGetenvs()
获取当前运行环境的全部环境变量串。
返回:array of string
示例
// 读取当前运行环境的所有环境变量
return sysGetenvs();
// 部分结果截图:
sysexecGetenvs()
获取子进程的环境变量,应用于Sysexec创建的子进程。
返回:array of string
示例
sysExecSetEnvs(array("test=test", "test1=test1"), 2);
return sysexecGetenvs();
// 输出:
// array("test=test","test1=test1","ALLUSERSPROFILE=C:\\ProgramData","APPDATA=C:\\Users\\cobia\\AppData\\Roaming","CODEX_CI=1","CODEX_MANAGED_BY_NPM=1","CODEX_MANAGED_PACKAGE_ROOT=...
// 注:更多应用可参考Sysexecsetenvs
dbglocalcancel(id)
注销任务。该功能可以用来终止运行的WEB任务。
| 参数 | 类型 | 说明 |
|---|---|---|
id |
integer | 为dbglocalrunning中返回信息中的id字段以十六进制模式转换为64位整数 |
返回:bool
sysThreadSelf()
获取当前程序的线程ID。
返回:integer|int64
示例
// 在客户端中,本地执行如下代码:
return sysThreadSelf();
// 返回值:线程ID,如11000
// 通过cmd查看天软客户端进程与线程,结果如下:
syslinuxkrnlclosemutex(name, isprivate)
支持在LINUX上手动删除掉因互斥支持产生的系统信号量以及临时目录的文件
| 参数 | 类型 | 说明 |
|---|---|---|
name |
string | 字符串,互斥锁名称 |
isprivate |
bool | 是否私有 |
返回:any
sysSetThreadPriority(pri, tid)
设置线程优先级
| 参数 | 类型 | 说明 |
|---|---|---|
pri |
integer | 线程优先级 |
tid |
integer | 可选参数,线程ID。未指定时默认设置当前线程优先级 |
返回:integer
示例
范例01:设置当前线程优先级
ret := sysSetThreadPriority(1);
if ret=0 then
return 1;
else
return "设置线程优先级失败!";
// 输出:返回1,设置成功。
范例02:设置指定线程优先级
// 创建函数指针
c := makeinstance(thisfunction(func_pos), "cdecl", 1);
// 创建线程
handle := CreateThread(nil, 10240000, c, nil, 0, tid);
ret := sysSetThreadPriority(1, tid);
if ret=0 then
return 1;
else
return "设置线程优先级失败!";
// 定义WindowsAPI的CreateThread函数声明。
function CreateThread(attr: pointer;size: pointer;addr: pointer;p: pointer;flag: integer;var threadid: integer): pointer;external "kernel32.dll" name "CreateThread";
// 自定义函数,用于创建函数指针
function FuncPos(p: pointer): integer;
begin
sleep(random(3000));
return 1;
end;
// 输出:返回1,设置成功。
sysGetThreadPriority(pri, tid)
获取线程优先级
| 参数 | 类型 | 说明 |
|---|---|---|
pri |
integer | 变参,整数,线程优先级 |
tid |
integer | 整数,可选参数,线程ID。未指定时默认获取当前线程优先级 |
返回:integer
示例
范例01:获取当前线程优先级
ret := sysGetThreadPriority(pri);
if ret=0 then
return pri;
else
return "获取线程优先级失败!";
范例02:获取指定线程优先级
tid := 18024; // 指定线程ID
ret := sysGetThreadPriority(pri, tid);
if ret=0 then
return pri;
else
return "获取线程优先级失败!";
sysGetThreadName(tid)
获取线程名称
| 参数 | 类型 | 说明 |
|---|---|---|
tid |
integer | 整数,可选参数,线程ID。未指定时默认获取当前线程名称 |
返回:string
示例
范例01:获取当前线程名称
ret := sysGetThreadName();
if ret then
return ret;
else
return "获取线程名称失败!";
范例02:获取指定线程名称
tid := 18024; // 指定线程ID
ret := sysGetThreadName(tid);
if ret then
return ret;
else
return "获取线程名称失败!";
sysGetThreads(pid)
获取进程内的线程列表
| 参数 | 类型 | 说明 |
|---|---|---|
pid |
integer | 整数,可选参数,进程ID。未指定时默认获取当前进程内的线程列表 |
返回:array,tablearray
示例
范例01:获取当前进程内的线程列表
ret := sysGetThreads();
return ret;
// 输出:
// array(52412,37192,19952,47976,46252,25228,13360,24792,33176)
范例02:获取指定进程内的线程列表
// 打开记事本,在任务管理器中查找对应进程ID:
ret := sysGetThreads(2932);
return ret;
// 输出:
// array()
sysPPid(pid)
获得进程的父进程ID
| 参数 | 类型 | 说明 |
|---|---|---|
pid |
integer | 整数,可选参数,进程ID。未指定时默认获取当前进程的父进程ID |
返回:integer
示例
范例01:获取当前进程的父进程ID
ret := sysPPid();
if ret then
return ret;
else
return "获取进程的父进程ID失败!";
范例02:获取指定进程的父进程ID
// 打开记事本,在任务管理器中查找对应进程ID:
ret := sysPPid(28848);
if ret then
return ret;
else
return "获取进程的父进程ID失败!";
// 输出:
// 无输出。
sysPidOfTid(tid)
获取线程所属进程ID
| 参数 | 类型 | 说明 |
|---|---|---|
tid |
integer | 整数,线程ID |
返回:integer
示例
范例01:获取当前线程所属进程
tid := sysThreadId(); // 获取当前线程ID
ret := sysPidOfTid(tid);
if ret then
return ret;
else
return "获取线程所属进程ID失败!"
sysPidOfHandle(handle)
根据进程句柄获取进程ID。在Linux上,返回和进程句柄值相同的整数
| 参数 | 类型 | 说明 |
|---|---|---|
handle |
integer | 进程句柄 |
返回:integer
示例
范例01:根据进程句柄获取进程ID
// TSL解析器路径
path := "D:\\Program Files\\AnalyseNG.NET\\TSL.exe";
// 创建管道
ret := sysExecNewPipe();
// 创建一个TSL解析器进程
if ret then
handle := sysExec(path, "TSL", nil, 0, code); // 返回进程句柄
ret := sysPidOfHandle(handle);
sysTerminate(rc, handle); // 关闭TSL解析器进程
if ret then
return ret;
else
return "根据进程句柄获取进程ID失败!"
sysHandleOfPid(pid, rights, inherithandle)
Windows上获取进程id对应的句柄,Linux上获取指定文件ID的复制ID。得到的句柄可用函数FAQ:SysCloseHandle进行关闭。
| 参数 | 类型 | 说明 |
|---|---|---|
pid |
integer | 整数,进程ID |
rights |
integer | 整数,可选参数,设置进程句柄权限,Linux上无效。常见的权限设置值见下表。 |
inherithandle |
integer | 布尔值,可选参数,是否继承,Linux上无效 |
常见权限值:
| 值 | 十进制值 | 访问权限 | 可操作范围 |
|---|---|---|---|
0x0010 |
16 | PROCESS_VM_READ | 读取进程内存内容 |
0x0400 |
1024 | PROCESS_QUERY_INFORMATION | 查询完整进程信息(令牌、优先级等) |
0x1000 |
4096 | PROCESS_QUERY_LIMITED_INFORMATION(缺省值) | 仅查询进程基础信息(PID、退出代码等) |
0xFFFF |
65535 | PROCESS_ALL_ACCESS | 所有权限(包括终止、内存写入等) |
返回:integer
sysGetLastError()
获得系统操作的最后一个返回代码。
返回:integer
sysCmdLine()
获得解析器的真实命令行串。
返回:string
sysTerminate(ret_code, handle)
终止进程。
| 参数 | 类型 | 说明 |
|---|---|---|
ret_code |
integer | 整数,终止进程返回的代码。 |
handle |
integer | 整数,终止进程的句柄。缺省为终止自身进程。 |
返回:any
sysCloseHandle(handle)
关闭一个句柄,如互斥锁,文件句柄等。
| 参数 | 类型 | 说明 |
|---|---|---|
handle |
integer | 整数,句柄编号 |
返回:bool
示例
// 启动windows平台下的windows命令处理程序,然后关闭启动该程序时返回的句柄
tool_path := "C:\\Program Files\\Windows Media Player";
ret := rdo2 sysExec(tool_path+"\\wmplayer.exe", "D:\\test1\\when_ever.mp3", tool_path, 1, returncode);
ret1 := rdo2 sysCloseHandle(ret);
return ret1;
// 结果:1
dbglocalrunning()
获得当前所有的任务列表以及堆栈信息,主要用于web等检查在运行中的任务。
返回:array,tablearray
示例
// 在本地脚本中运行下面代码:
t := dbglocalrunning();
echo toStn(t);
return 1;
// 打印信息如下:
array(
("StartInfo":
("id": "000001b9b8e30440", "info": "C:\\Users\\xxxxx\\Tinysoft\\Analyse.NET\\editer\\cmpCachesnewfile\\new12.tsl", "createtm": 45602.6995526042), "CallStack":
(
("NAME": "__main__", "USER": "local", "LINE": 3))))
sysGetProcessList()
获取当前进程列表信息
返回:array,tablearray
示例
ret := sysGetProcessList();
if ret<>0 then
return ret;
else
return "当前进程列表信息失败!";
// 部分结果如下:
sysGetProcessListw()
获取当前进程列表信息,信息中字符串为宽字节字符串
返回:array,tablearray
示例
ret := sysGetProcessListw();
if ret<>0 then
return ret;
else
return "当前进程列表信息失败!";
// 部分结果如下:
sysGetWndOfCaption(cap, is_contain_string)
获得所有标题窗口串包含或者等于指定串的所有窗口句柄。
| 参数 | 类型 | 说明 |
|---|---|---|
cap |
string | 字符串,窗口的标题。 |
is_contain_string |
布尔类型,是否包含,可选参数参数,默认是包含。 |
返回:array of hwnd
示例
// 获取标题是”test.docx”的窗口句柄。
v := sysGetWndOfCaption("test.docx");
echo v;
sysGetPidtidOfWnd(wnd, thread_id)
获得窗口句柄的进程ID, 通过ThreadId可输出线程id
| 参数 | 类型 | 说明 |
|---|---|---|
wnd |
hwnd | 整型,窗口句柄。 |
thread_id |
integer | 输出值,整型,线程号,给定该参数可以获取线程ID。 |
返回:integer
示例
// 获取标题是”test.docx”的窗口的word的进程ID。
// 获取标题是”test.docx”的窗口句柄
wnd := sysGetWndOfCaption("test.docx");
// 通过窗口句柄获得进程ID
v := sysGetPidtidOfWnd(wnd[0]);
echo v;
sysSetThreadName(name, tid)
设置线程名称
| 参数 | 类型 | 说明 |
|---|---|---|
name |
string | 字符串,要设置的名称 |
tid |
integer | 整数,可选参数,线程ID。未指定时默认设置当前线程名称 |
返回:integer
示例
范例01:设置当前线程名称
ret := sysSetThreadName("TinySoft");
if ret=0 then
return 1;
else
return "设置线程名称失败!";
// 输出:返回1,设置成功。
范例02:设置指定线程名称
// 创建函数指针
c := makeinstance(thisfunction(func_pos), "cdecl", 1);
// 创建线程
handle := CreateThread(nil, 10240000, c, nil, 0, tid);
ret := sysSetThreadName("TinySoft", tid);
if ret=0 then
return 1;
else
return "设置线程名称失败!";
// 定义WindowsAPI的CreateThread函数声明。
function CreateThread(attr: pointer;size: pointer;addr: pointer;p: pointer;flag: integer;var threadid: integer): pointer;external "kernel32.dll" name "CreateThread";
// 自定义函数,用于创建函数指针
function FuncPos(p: pointer): integer;
begin
sleep(random(3000));
return 1;
end;
// 输出:返回1,设置成功。