Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Возврат управления граф. интерфейсу в Perl (https://forum.antichat.xyz/showthread.php?t=139656)

UpsPig 06.09.2009 00:58

Возврат управления граф. интерфейсу в Perl
 
Есть программа на перле использующая TK
По нажатию на кнопку запускается подпрограмма в теле которой
например лежит алгоритм поиска определённого слова в файлах хранящихся на винте
При нахождении совпадения подпрограмма пишет в текстбокс
имя и путь к этому файлу
Проблема в том после запуска этой самой подпрограммы кнопка залипает, окно становится недоступным и приходится ждать завершения подпрограммы
Как сделать так, что бы эта подпрограмма выполнялась прозрачно не отнимая управление у окна?

Kaimi 06.09.2009 01:45

Например fork заюзать, либо вызывать $main_window->update по ходу поиска

UpsPig 06.09.2009 02:23

Если попадается большой файл $main_window->update не катит поскольку на время поиска в этом файле управление всё равно отнимается.

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

Kaimi 06.09.2009 02:33

Код:

#!/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
        }
}


UpsPig 06.09.2009 03:07

Работает, но как теперь послать окну инфу?
Например:
Код:

#!/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
        }

А то ошибка


Время: 06:04