免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2149 | 回复: 1
打印 上一主题 下一主题

关于tk和fork [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-16 14:24 |只看该作者 |倒序浏览
请教各位大侠,我想用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;

论坛徽章:
0
2 [报告]
发表于 2010-08-16 15:57 |只看该作者

  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. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP