PDA

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


UpsPig
06.09.2009, 00:58
Есть программа на перле использующая 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
}

А то ошибка