Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl在sub()更改时从while(1)循环中获取变量的值_Perl_Variables_Loops_Tk_Perltk - Fatal编程技术网

Perl在sub()更改时从while(1)循环中获取变量的值

Perl在sub()更改时从while(1)循环中获取变量的值,perl,variables,loops,tk,perltk,Perl,Variables,Loops,Tk,Perltk,我有个小问题 当我在脚本的主块中创建线程时,它应该在while1循环中获得$txt值,同时在程序创建顶级窗口中,$txt字符串中有一个文本对象 我只想在创建文本对象时从文本对象读取值,而不是更早 在我的示例中,$txt应该是一个全局变量,但我的线程仅通过“unde”读取$txt变量 当其他子程序更改变量时,是否可以从while1循环中读取该变量 我必须在线程中观察$txt变量,因为当我尝试在makeTop中启动线程时,Tk会给出关于不存在字符串的错误 谢谢你的建议 代码: 据 如前所述,默认情况

我有个小问题

当我在脚本的主块中创建线程时,它应该在while1循环中获得$txt值,同时在程序创建顶级窗口中,$txt字符串中有一个文本对象

我只想在创建文本对象时从文本对象读取值,而不是更早

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

当其他子程序更改变量时,是否可以从while1循环中读取该变量

我必须在线程中观察$txt变量,因为当我尝试在makeTop中启动线程时,Tk会给出关于不存在字符串的错误

谢谢你的建议

代码:

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


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

请修复缩进,以便代码更具可读性。我推荐perltidy,这不是关于代码的问题,而是关于从while1循环中实时读取变量的问题。如果你知道怎么做,我会很高兴的:在你修好之前,我甚至懒得看你的代码。@KamilHajduk我们不认为你不知道如何格式化你的代码。我们告诉您,如果您需要我们的帮助,您需要发布易于阅读的代码。如果你懒得花点力气,为什么你认为我们会花点力气来帮助你?
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 );
}