+ -
当前位置:首页 → 问答吧 → 关于tk和fork

关于tk和fork

时间:2010-08-16

来源:互联网

请教各位大侠,我想用tk实现这样一个功能: 点击button stop后,button的item显示为start,同时label中的text停止滚动显示,然后点击button start,label的text会继续显示。
以下是我写的, 发现在tk中fork时,sleep 没有生效,而且感觉变量$but改变也没有生效,如果不用fork直接使用信号,那么就会阻塞,sleep 10s后,button才能改变,而不是按下去就改变,
是什么问题呢?关于进程、事件驱动这块我理解的还不深入,希望学习下。
#!/usr/bin/perl
use TK;
my $mw = MainWindow->new;
my $mess = "this is from me ^o^";
my $but = "Stop";
my ($ppid,$pid);
$SIG{'USR1'} = sub {
    sleep(10);
};
$ppid = $$;
$mw->Label(-textvariable => \$mess)->pack(-expand => "1");
$mw->after(100,\&scroll);
$mw->Button(
    -textvariable    => \$but,
    -command => sub {
      if($but eq "Start") {
        $pid = fork();
        if ( $pid ==0 ) {
           print "start->stop\n";
        } else {
          wait;
          $but = "Stop";
        }
      } else {
        $pid = fork();
        if ( $pid ==0 ) {
           system("kill -USR1 $ppid");
           print "stop->start\n";
        } else {
          wait;
          $but = "Start";
        }
      }
    }
)->pack;

sub scroll {
$mess =~ /(.)(.*)/;
$mess = "$2$1";
$mw->after(100,\&scroll);
}
$mw->MainLoop;

作者: demil   发布时间: 2010-08-16

  1. #!/bin/env perl

  2. use strict;
  3. use warnings;
  4. use TK;

  5. my $mw = MainWindow->new;
  6. my $mess = "this is from me ^o^";
  7. my $btn_text = "Stop";
  8. my $event_id = undef;

  9. $mw->Label(-textvariable => \$mess)->pack(-expand => "1");
  10. $mw->Button
  11. (
  12.         -textvariable => \$btn_text,
  13.         -command =>
  14.         sub
  15.         {
  16.                 if($btn_text eq "Start")
  17.                 {
  18.                         $btn_text = "Stop";
  19.                         if (defined $event_id)
  20.                         {
  21.                                 $mw->afterCancel($event_id);
  22.                                 $event_id = undef;
  23.                         }

  24.                         $event_id = $mw->repeat(100, \&scroll);
  25.                 }
  26.                 else
  27.                 {
  28.                         $btn_text = "Start";
  29.                         if (defined $event_id)
  30.                         {
  31.                                 $mw->afterCancel($event_id);
  32.                                 $event_id = undef;
  33.                         }
  34.                 }
  35.         }
  36. )->pack();

  37. $event_id = $mw->repeat(100, \&scroll);
  38. $mw->MainLoop();

  39. #################################################################

  40. sub scroll
  41. {
  42.         $mess = substr($mess, 1) . substr($mess, 0, 1);
  43. }
复制代码

作者: 黑色阳光_cu   发布时间: 2010-08-16