2

我是 Perl 和 Curses 的新手,但我正在努力让我的代码运行一个循环,首先是我的代码:

#!/usr/bin/env perl

use strict;
use Curses::UI;

sub myProg {
    my $cui = new Curses::UI( -color_support => 1 );

    my $win = $cui->add(
        "win", "Window", 
        -border => 1, 
    );

    my $label = $win->add(
        'label', 'Label', 
        -width         => -1, 
        -paddingspaces => 1,
        -text          => 'Time:', 
    );
    $cui->set_binding( sub { exit(0); } , "\cC");

    # I want this to loop every second 
    $label->text("Random: " . int(rand(10)));
    sleep(1);

    $cui->mainloop();

}

myProg();

如您所见,我希望本节以递归方式运行:

    # I want this to loop every second 
    $label->text("Random: " . int(rand(10)));
    sleep(1);

在标签中放置一个随机数的想法只是为了表明它有效,我最终会有相当多的标签会定期更改,并且还想做其他功能。

我试过做:

while (1) {
    ...
}

但是如果我在 mainloop() 之前这样做;调用窗口永远不会创建,调用后它什么也不做?

希望这有意义吗?那么我该怎么做呢?

4

1 回答 1

6

一旦您启动主循环,Curses 就会接管程序的执行流程,并且仅通过您之前设置的回调将控制权返回给您。在此范例中,您不会使用sleep()循环执行与时间相关的任务,而是要求系统定期给您回电以进行更新。

Curses::UI通过(未记录的)计时器重组你的程序来做到这一点:

#!/usr/bin/env perl

use strict;
use Curses::UI;

local $main::label;

sub displayTime {
    my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
    $main::label->text("Time: $hour:$minute:$second");
}

sub myProg {
    my $cui = new Curses::UI( -color_support => 1 );

    my $win = $cui->add(
        "win", "Window",
        -border => 1,
    );

    $main::label = $win->add(
        'label', 'Label',
        -width         => -1,
        -paddingspaces => 1,
        -text          => 'Time:',
    );
    $cui->set_binding( sub { exit(0); } , "\cC");
    $cui->set_timer('update_time', \&displayTime);


    $cui->mainloop();

}

myProg();

如果您需要更改超时时间,set_timer也可以接受时间作为附加参数。相关函数enable_timer, disable_timer, delete_timer.

资料来源:http ://cpan.uwinnipeg.ca/htdocs/Curses-UI/Curses/UI.pm.html#set_timer-

于 2012-08-02T13:08:11.000 回答