文档中心

TD开发平台_基础

06.其他常用功能

程序中存在有各种打印输出的信息,如出错、警告、调试等等,在一个系统中存在多个程序在同时运行,它们同时输出的各种信息混杂在一起难以区分和控制,需要有一个信息输出控制的机制,可以达到以下目的:
1.简单、好用,因为 C语言中打印输出都是调用 printf这一类的函数,所以最好能够和 printf的使用方法类似。
2.在多个程序同时输出的信息中,能够区分是哪个程序的信息,并能够区分是出错信息还是警告信息等等。
3.能够在程序不用重新编译的情况下,方便控制所有的程序是否能输出信息,也能够控制某一个程序是否能输出信息。
TD图形软件系统的日志输出控制提供了用于输出不同类型或级别信息的 5个宏,这些宏的用法和 printf的用法一模一样,这些宏总是打印信息到标准错误输出。

类型

级别

例子

TLogF(format, ...)

Fatal:重大错误信息

TLogF(“this is fatal error: %d,%s\n”,

n, string)

TLogE(format, ...)

Error:错误信息

TLogE(“this is error: %d,%s\n”, n,

string)

TLogW(format, ...)

Warning:警告信息

TLogW(“this is warning: %d,%s\n”,

n, string)

TLogI(format, ...)

Info:一般信息

TLogI(“this is info: %d,%s\n”, n,

string)

TLogD(format, ...)

Debug:调试信息

TLogD(“this is debug info: %d,%s\n”,

n, string)

通过这些宏输出的信息前面,都会自动附上进程的名字和消息的类型:

类型

上面例子的输出假设程序名为demo,n=1,string=”xxx”

TLogF(format,...)

[demo-Fatal]this is fatal error: 1,xxx

TLogE(format,...)

[demo-Error]this is error: 1,xxx

TLogW(format,...)

[demo-Warning]this is warning: 1,xxx

TLogI(format,...)

[demo-Info]this is info: 1,xxx

TLogD(format,...)

[demo-Debug]this is debug info: 1,xxx

如何灵活的实现输出控制: 5种输出类型分别表示信息重要性的 5个级别,Fatal表示最重要的信息,Debug表示最不重要的信息。给每个程序都设置一个输出级别,只有比输出级别同等重要或更重要的信息才能输出。
通过一个 TLOG的环境变量来设置每一个程序的输出级别,为了简洁起见,在 TLOG的内容中用‘ F’表示 Fatal级别、‘E’表示 Error级别、‘W’表示 warning级别、‘I’表示 info级别、‘D’表示 debug级别。
a.当没有设置 TLOG环境变量时,所有进程的默认输出级别为 Debug,即都能输出。
b.当设置 TLOG的内容为 ”X”时( X为”FEWID”中的一个字符),所有进程的输出级别为 X所表示的级别。
c.当设置 TLOG的内容为 ”demo=X”时( X为”FEWID”中的一个字符),demo进程
的输出级别为 X所表示的级别,其他程序的输出级别不变。下面是组合设置的例子:

export TLOG 或者TLOG=””

所有程序的输出级别为Debug。

export TLOG=”F” 或者TLOG=“F;”

所有程序的输出级别为Fatal。

export TLOG=”E;demo=D”

所有程序的输出级别为Error,除了Demo 程序的输出级别是Debug。

export TLOG=”E;demo=D;hello=W”

所有程序的输出级别为Error,除了Demo 程序的输出级别是Debug , hello 程序的是Warning。

export TLOG=”demo=D;hello=W”

所有程序的输出级别为Debug,除了demo程序的输出级别是Debug,hello 程序的是Warning。

注意: TLOG的内容中不能有多余的空格。仍然提供了一个特殊的宏 TLogP,用于不管当前的输出级别总是可以输出信息,并且输出内容的前面不附加信息。
下面几个宏用于执行动作:

级别

例子

说明

TLogF_do(...)

TLogF_do(TTableDump(mytable);)

当满足级别要求时才调用TTableDump 函数打印mytable 的内容。(TTableDump 内部打印信息用TLogP)

TLogE_do(...)

TLogE_do(TTableDump(mytable);)

TLogW_do(...)

TLogW_do(TTableDump(mytable);)

TLogI_do(...)

TLogI_do(TTableDump(mytable);)

TLogD_do(...)

TLogD_do(TTableDump(mytable);)

2)程序路径获取

const char *TGetExecutePath(const char *suffix);
该函数用于获取当前程序文件在文件系统中的绝对路径,有以下几种用法:
1.suffix为 NULL时,返回当前程序文件在文件系统中的目录的绝对路径。
2.suffix为绝对路径时,就返回 suffix的内容。
suffix为相对路径时,返回相对于当前程序文件在文件系统中的目录的绝对路径。例如:

suffix

返回内容(假定程序文件为 ”/tdGUI/demo/bin/demo”) 

“etc/config.ini”

“/tdGUI/demo/bin/etc/config.ini”

“../etc/config.ini”

“/tdGUI/demo/bin/../etc/config.ini”

“/etc/config.ini”

“/etc/config.ini

NULL

“/tdGUI/demo/bin/”

注意:该函数每次返回的都是它内部静态分配的内存,不需要用户释放该内存,所以下面的用法是错误的: 

printf(“path1=%s, path2=%s\n”, TGetExecutePath(“file1”), TGetExecutePath(“file2”));

输出信息为: path1=/tdGUI/demo/bin/file1, path2=/tdGUI/demo/bin/file1

还有一个函数用于获取调用该函数的函数所在文件的绝对路径,比如用于获取动态链接库所在的路径。用法和 TGetExecutePath相同。 

const char *TGetFunctionPath(const char *suffix);