Возврат управления граф. интерфейсу в Perl

Discussion in 'PHP' started by UpsPig, 6 Sep 2009.

  1. UpsPig

    UpsPig New Member

    Joined:
    22 Jun 2008
    Messages:
    22
    Likes Received:
    1
    Reputations:
    0
    Есть программа на перле использующая TK
    По нажатию на кнопку запускается подпрограмма в теле которой
    например лежит алгоритм поиска определённого слова в файлах хранящихся на винте
    При нахождении совпадения подпрограмма пишет в текстбокс
    имя и путь к этому файлу
    Проблема в том после запуска этой самой подпрограммы кнопка залипает, окно становится недоступным и приходится ждать завершения подпрограммы
    Как сделать так, что бы эта подпрограмма выполнялась прозрачно не отнимая управление у окна?
     
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Например fork заюзать, либо вызывать $main_window->update по ходу поиска
     
    _________________________
  3. UpsPig

    UpsPig New Member

    Joined:
    22 Jun 2008
    Messages:
    22
    Likes Received:
    1
    Reputations:
    0
    Если попадается большой файл $main_window->update не катит поскольку на время поиска в этом файле управление всё равно отнимается.

    Можно про fork подробнее? Неплохо бы пример
     
  4. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Code:
    #!/usr/bin/perl
    use strict;
    use Tk;
    
    my $mw = MainWindow->new;
    $mw->geometry("220x150");
    
    $mw->Button(
    	-text => "Sleep",
    	-command => \&action,
    	)->pack;
    MainLoop;
    
    sub action {
     my $chld = fork();
     if ($chld == 0)
    	{
    	 while(1)
    		{
    		 print 123;
    		 sleep 1;
    		}
    	}
     else
    	{
    	 return
    	}
    }
    
    
     
    _________________________
  5. UpsPig

    UpsPig New Member

    Joined:
    22 Jun 2008
    Messages:
    22
    Likes Received:
    1
    Reputations:
    0
    Работает, но как теперь послать окну инфу?
    Например:
    Code:
    #!/usr/bin/perl
    
    use Tk;
    use Tk::ROtext;
    
    $mw = MainWindow->new;
    $mw->geometry("400x400");
    $print = $mw->Scrolled('ROText',-scrollbars=>'e',-height=>22,-width=>45)->pack();
    
    $mw->Button(
    	-text => "Sleep",
    	-command => \&action,
    	)->pack;
    MainLoop;
    
    sub action {
     $chld = fork();
     if ($chld == 0)
    	{
    	 while(1)
    		{
    		 $print->insert('end',"123");
    		 sleep 1;
    		}
    	}
     else
    	{
    	 return
    	}
    А то ошибка