Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Perl+Tkx

9.0K
02 июня 2010 года
elvenoracle
56 / / 16.04.2007
Добрый день. Есть следующий код, в котором метка lable обновляется раз в 5 сек.

Код:
#!/usr/bin/perl -w
use strict;
use Tkx;

my ($i, $mw, $labelframe, $label);
$i = 0;

$mw = Tkx::widget->new('.');
$mw->g_wm_title("My Window");
$labelframe = $mw->new_ttk__labelframe( -text => "labelframe", -padding => q/5 5 5 5/ );
$labelframe->g_grid(-stick => "w", -padx => 10, -pady => 10);
$label = $labelframe->new_ttk__label(-text => "$i");
$label->g_grid( -row => 0, -column => 0, -stick => "w" );
&update;
Tkx::MainLoop();

sub update {
    $label->configure(-text => $i);
    Tkx::after(5000,\&update);
    $i++;
}


Работает отлично, но если &update содержит что-то такое, что требует несколько секунд на выполнение, то все окно подвисает на это время.
Как быть?
Спасибо.
9.0K
02 июня 2010 года
elvenoracle
56 / / 16.04.2007
может использовать потоки?
307
03 июня 2010 года
Artem_3A
863 / / 11.04.2008
да, нужно использовать потоки, используйте.
9.0K
03 июня 2010 года
elvenoracle
56 / / 16.04.2007
Цитата: Artem_3A
да, нужно использовать потоки, используйте.



А можно хотя бы немножко поподробнее ? :)

9.0K
03 июня 2010 года
elvenoracle
56 / / 16.04.2007
Получилось примерно так, не знаю насколько правильно реализовал...

Код:
#!/usr/bin/perl -w
use strict;
use threads;
use threads::shared;
use Tkx;

my $i:shared = 0;

my $thread = threads->create(\&incr)->detach();

my $mw = Tkx::widget->new('.');
$mw->g_wm_title("EMy Window");
my $label = $mw->new_ttk__label(-text => "$i");
$label->g_grid( -row => 0, -column => 0, -stick => "w" );
&update;
Tkx::MainLoop();

sub incr {
    while (1) {
        sleep 5;
        print "$i\n";
        $i++;
    }
}

sub update {
    $label->configure(-text => "$i");
    Tkx::after(10000,\&update);
}
9.0K
03 июня 2010 года
elvenoracle
56 / / 16.04.2007
Единственное что, при закрытии окна программы, реализованной на подобии выше приведенного примера в консоли появляется ошибка:
 
Код:
Free to wrong pool 245f40 not 56b0320 at (eval 3) line 1.
307
03 июня 2010 года
Artem_3A
863 / / 11.04.2008
следует обработать событие закрытия окна, то есть при возникновении оного события следует завершать работу потока.
9.0K
03 июня 2010 года
elvenoracle
56 / / 16.04.2007
Цитата: Artem_3A
следует обработать событие закрытия окна, то есть при возникновении оного события следует завершать работу потока.



 
Код:
$mw->g_wm_protocol( 'WM_DELETE_WINDOW', [\&close, $mw] );


 
Код:
sub close {
    $thread = threads->exit();
    $mw->g_destroy();
}


и тоже самое...или я что-то не так делаю?
307
03 июня 2010 года
Artem_3A
863 / / 11.04.2008
Почитайте сие, может поможет.
9.0K
04 июня 2010 года
elvenoracle
56 / / 16.04.2007
Разобрался, там не в закрытии потока дело было :)
307
04 июня 2010 года
Artem_3A
863 / / 11.04.2008
ну тогда решение в студию, дабы поделиться опытом с сообществом, внести свою лепту так сказать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог