3

我制作了 2 个记录器,每个线程一个,如下所示(THREAD=2):

lsd_logger[THREADS]      : list of message_logger is instance; 
  keep for each in lsd_logger {
      soft it.tags      == {appendf("DBG%d",index).as_a(message_tag)};
      it.to_file        == appendf("lsd%d.elog", index);
      soft it.verbosity == HIGH;
      it.to_screen == FALSE;
  };

现在我有一个检查器,我想根据当前运行的线程向每个记录器发送一条消息,如下所示:

messagef(appendf("DBG%d",thread).as_a(message_tag), MEDIUM, "this is a message to logger %d",thread);

但是我不断收到关于这不是一个持续冗长的错误。

有没有办法像这样给出 message_tag 而不是创建一个函数来处理打印?

谢谢,

4

1 回答 1

3

不,这是不可能的。消息的标签必须是硬编码的,因此它应该是一个常量标签,而不是任何返回标签的表达式。

您可以通过定义如下方法来解决该问题:

my_message() is {
    case thread {
        0: {
            messagef(DBG0, MEDIUM, "this is a message to logger 0");
           };
        1: {
            messagef(DBG1, MEDIUM, "this is a message to logger 1");
           };
    };
};

那么如果你想避免用重复的代码编写这个很长的方法(你甚至需要在每次线程数改变时修改它),你可以使用define as computed宏来代替,例如:

define <my_message'action> "my_message" as computed {
    items: list of string;
    for i from 0 to THREADS-1 do {
        items.add(appendf("%d: {messagef(DBG%d, MEDIUM, \"this is a message to logger %d\")}", i, i, i));
    };
    result = appendf("case thread { %s }", str_join(items, ";"));
};
于 2016-01-21T11:11:07.670 回答