免费注册 查看新帖 |

Chinaunix

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

threads的实现一定是有问题的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-19 08:38 |只看该作者 |倒序浏览
不管在Tk或者Gtk2里,只要一join或者detach,程序就崩溃了
  1. #!/bin/env perl

  2. use strict;
  3. use warnings;
  4. use threads;
  5. use Tk;

  6. my $mw = Tk::MainWindow->new();
  7. my $btn = $mw->Button(-text => "hello", -command => sub
  8. {
  9.         my $t = threads->create(sub
  10.         {
  11.                 print "here\n";
  12.         });

  13.         $t->join();
  14. })->pack();

  15. Tk::MainLoop();
复制代码
  1. #!/bin/env perl

  2. use strict;
  3. use warnings;
  4. use threads;
  5. use Gtk2;
  6. use Glib qw(TRUE FALSE);

  7. Glib::Object->set_threadsafe(TRUE);
  8. Gtk2::Gdk::Threads->init();
  9. Gtk2->init();
  10. my $mw = Gtk2::Window->new();
  11. my $btn = Gtk2::Button->new("Click me");

  12. $mw->add($btn);

  13. $btn->signal_connect(clicked => \&new_thread);

  14. $mw->show_all();
  15. Gtk2::Gdk::Threads->enter();
  16. Gtk2->main();
  17. Gtk2::Gdk::Threads->leave();

  18. #####################################################

  19. sub new_thread
  20. {
  21.         Gtk2::Gdk::Threads->enter();
  22.         my $t = threads->create(\&hello);
  23.         $t->detach();
  24.         Gtk2::Gdk::Threads->leave();
  25. }

  26. sub hello
  27. {
  28.         print "say hello\n";
  29. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-11-19 08:41 |只看该作者
能工作的写法只能是这样子:
  1. #!/bin/env perl

  2. use strict;
  3. use warnings;
  4. use threads;
  5. use Thread::Queue;

  6. my $queue = Thread::Queue->new();
  7. threads->create(\&hello);

  8. require Gtk2; import Gtk2;
  9. require Glib; import Glib qw(TRUE FALSE);
  10. sub TRUE();
  11. sub FALSE();

  12. Gtk2::Gdk::Threads->init();
  13. Gtk2->init();
  14. my $mw = Gtk2::Window->new();
  15. my $btn = Gtk2::Button->new("Click me");

  16. $mw->add($btn);

  17. $btn->signal_connect(clicked => \&new_thread);

  18. $mw->show_all();
  19. Gtk2::Gdk::Threads->enter();
  20. Gtk2->main();
  21. Gtk2::Gdk::Threads->leave();

  22. ##############################################

  23. sub new_thread
  24. {
  25.         $queue->enqueue(1);
  26. }

  27. sub hello
  28. {
  29.         while ($queue->dequeue())
  30.         {
  31.                 my $t = threads->create(sub
  32.                 {
  33.                         print "say hello\n";
  34.                 });

  35.                 $t->detach();
  36.         }
  37. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-11-19 11:38 |只看该作者
Perl的threads需要继续改进,期待下一版本解决这些问题。

论坛徽章:
0
4 [报告]
发表于 2010-11-19 17:57 |只看该作者
原来在这里·····
只能暂时用这个方案了···

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-02 06:20:00
5 [报告]
发表于 2011-11-05 19:18 |只看该作者
本帖最后由 laolun 于 2011-11-05 19:19 编辑

回复 2# 黑色阳光_cu
借助你的想法,我稍作修改了下。可以在Gtk GUI界面上做widget更新;LWP抓取多网页内容
  1. #!/bin/env perl
  2. use strict;
  3. use warnings;
  4. use threads;
  5. use Thread::Queue;
  6. use LWP::Simple;
  7. use Gtk2; import Gtk2;
  8. use Glib; import Glib qw(TRUE FALSE);
  9. use Gtk2::GladeXML;
  10. Glib::Object->set_threadsafe(1);
  11. Gtk2::Gdk::Threads->init();
  12. Gtk2->init();
  13. my @url;
  14. foreach my $i(1..10){
  15.     push(@url,"/search?q=%C7%EF%D7%B0&commend=all&ssid=s5-e&s=".42*$i."#J_FilterTabBar")
  16. }
  17. my $glade = Gtk2::GladeXML->new('lwp-thr.glade');
  18. $glade->signal_autoconnect_from_package('main');
  19. my $window = $glade->get_widget('window1');
  20. $window->signal_connect('delete_event' => sub { Gtk2->main_quit; });
  21. my $btn=$glade->get_widget('button1');
  22. my $lab=$glade->get_widget('label1');
  23. my $queue = Thread::Queue->new();
  24. threads->create(\&run);
  25. $btn->signal_connect(clicked=>\&new_thread);
  26. $window->show_all();
  27. Gtk2::Gdk::Threads->enter();
  28. Gtk2->main();
  29. Gtk2::Gdk::Threads->leave();

  30. sub new_thread{
  31.         $queue->enqueue(@url);
  32. }

  33. sub run{
  34.         while (my $data=$queue->dequeue()){
  35.                 my $t = threads->create(\&work,$data,$lab);
  36.                 my $rt=$t->join();
  37.                 print $rt."\n";
  38.         }
  39. }
  40. sub work{
  41.     my ($data,$lab)=@_;
  42.     get_c($data);
  43.     $lab->set_text("PROcessing $data");
  44.     return $data;
  45. }
  46. sub get_c{
  47.     my ($url)=@_;
  48.     $url="http://s.taobao.com".$url;
  49.     my $c=get($url);
  50.     my $fn;
  51.     if($url=~/s=(\d+)/){
  52.         $fn=$1;
  53.     }
  54.     open(OUT,">$fn.htm") or die $!;
  55.     print OUT $c;
  56.     close(OUT);
  57. }
复制代码
附上glade文件的代码:
文件名:lwp-thr.glade
  1. <?xml version="1.0"?>
  2. <glade-interface>
  3.   <!-- interface-requires gtk+ 2.16 -->
  4.   <!-- interface-naming-policy project-wide -->
  5.   <widget class="GtkWindow" id="window1">
  6.     <child>
  7.       <widget class="GtkVBox" id="vbox1">
  8.         <property name="visible">True</property>
  9.         <property name="orientation">vertical</property>
  10.         <child>
  11.           <widget class="GtkLabel" id="label2">
  12.             <property name="visible">True</property>
  13.           </widget>
  14.           <packing>
  15.             <property name="position">0</property>
  16.           </packing>
  17.         </child>
  18.         <child>
  19.           <widget class="GtkButton" id="button1">
  20.             <property name="label" translatable="yes">button</property>
  21.             <property name="visible">True</property>
  22.             <property name="can_focus">True</property>
  23.             <property name="receives_default">True</property>
  24.           </widget>
  25.           <packing>
  26.             <property name="position">1</property>
  27.           </packing>
  28.         </child>
  29.         <child>
  30.           <widget class="GtkLabel" id="label1">
  31.             <property name="visible">True</property>
  32.             <property name="label" translatable="yes">label</property>
  33.           </widget>
  34.           <packing>
  35.             <property name="padding">18</property>
  36.             <property name="position">2</property>
  37.           </packing>
  38.         </child>
  39.       </widget>
  40.     </child>
  41.   </widget>
  42. </glade-interface>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP