Files
playbook/skills/tsl-api-reference/references/codegen/builtin/resource/process.md
T
csh c0bf0358e0 📝 docs(tsl): sync api skill with corrected codegen
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.
2026-07-07 16:47:03 +08:00

26 KiB
Raw Blame History

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。得到的句柄可用函数FAQSysCloseHandle进行关闭。

参数 类型 说明
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,设置成功。