1

我遇到了一个小问题。

当我在脚本的主块中创建线程时,应该在 while(1) 循环中获取 $txt 值,同时程序创建 TopLevel 窗口并且 $txt 字符串中有一个 Text() 对象。

我想从 Text() 对象中读取值,仅在创建 Text() 对象时,而不是更早。

在我的示例中 $txt 应该是一个全局变量,但我的线程仅通过 'undef' 读取 $txt 变量。

当其他子例程更改变量时,是否可以从 while(1) 循环中读取变量?

我必须在线程中观看 $txt var,因为当我尝试在 makeTop() 中启动线程时,Tk 给了我关于不存在字符串的错误。

感谢您的建议。

代码:

use Tk;
use threads;
use warnings;

$mw = new MainWindow;
our $txt = undef;

my $lab = $mw->Label( -text=>"Main window.", -font => "ansi 12 bold")->pack;
my $but = $mw->Button( -text=>"Create Toplevel", -command => \&makeTop)->pack;

my $thr = threads->create('urls_couter');

MainLoop;

sub urls_couter {
   while (1) {
        if (defined $txt){
          $txt->get('1.0','end');
        }
   }
}

sub makeTop {
   my $top = $mw->Toplevel(); 

   $fr = $top->Frame()->grid( -row => 1, -column => 1 );
   $fr2 = $top->Frame()->grid( -row => 2, -column => 1 );

   my $top_lab = $fr->Label( -text => "URLs (each on a separate line) : ",
                             -font => "ansi 12 bold")->pack;

   $txt = $fr->Text( -width => 44, -height => 20)->pack;
   $txt->insert('end', "xxxxxxx");

   my $but_close = 
          $fr2->Button(
               -text    => "Ready!", 
               -command => sub { my @urls = split("\n", $txt->get('1.0','end-1c')); }, 
               -relief  => "raised", 
               -font    => "ansi 12 bold")->grid( -padx => 100, -row => 1, -column => 1 );

   $fr2->Button( 
                -text    => "Close", 
                -command => sub { destroy $top; },
                -relief  => "raised",
                -font    => "ansi 12 bold")->grid( -pady => 10, -row => 1, -column => 2 );
}
4

1 回答 1

0

据此_

如前所述,默认情况下,所有变量都是线程本地的。要使用共享变量,您还需要加载threads::shared:

线程本地意味着您不会在线程之外看到更改,因此在创建线程后,每个线程(逻辑上)都有自己的所有变量副本。

于 2013-08-09T00:19:23.807 回答