Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: GUI > Perl + Tk + потоки = проблема


Автор: BlindBandiit 11.5.2013, 00:53
Использую Perl Tk заотел на днях использовать многопоточность use threads::shared; оказалось что это не возможно :(
Есть ли способы решения?

Автор: alezzz 11.5.2013, 08:19
Делал многопоточное приложение на threads с Tkx интерфейсом. Были какие-то проблемы, но уже немогу вспомнить какие. Посмотрел в коде, создаю необходимое количество потоков до MainLoop и передаю им данные через shared переменные. А что не получается в Tk, может на Tkx попробовать?

Автор: BlindBandiit 14.5.2013, 11:53
Цитата(alezzz @ 11.5.2013,  08:19)
Делал многопоточное приложение на threads с Tkx интерфейсом. Были какие-то проблемы, но уже немогу вспомнить какие. Посмотрел в коде, создаю необходимое количество потоков до MainLoop и передаю им данные через shared переменные. А что не получается в Tk, может на Tkx попробовать?

Cтрано что у вас так получилось просто прочел статью там в самом начале написано что это не прокатит
http://habrahabr.ru/post/65592/ поверил наслово и даже не пробовал Tkx


Только попробовал  в тk такой  подход сразу выбивает приложение

Автор: alezzz 14.5.2013, 12:29
Для GUI-программ сначала рисую интерфейс в ActiveState GUI Builder, в результате получаю .pm с use Tkx вначале и всем что непосредственно связано с интерфейсом, и .pl, где логика программы, весь исходник конечно кидать не буду, вот примерно его суть:
Код

...
use threads;
use threads::shared;

...

my $items :shared;
my @urls :shared; # тут задания для потоков, каждый смотрит в массив если ли для него что-то

...

my @threads;
foreach my $num (0..9){
    push @threads, threads->create(\&getfirm, $num);
}

...

# далее сабы на кнопки и т.д., на кнопку Старт написан какой-то ###код, который постепенно кидает данные в @url, а потоки в хеш-референс $items возвращают результат

...

sub getfirm{
    my $num = shift;

    ...
    # тут то, что должен сделать поток, в цикле проверяет есть ли задание в @urls
}

...

# далее мне тоже GUI Builder помог
ParserToXML_gui::userinit() if defined &ParserToXML_gui::userinit;
our($top) = Tkx::widget->new('.');
ParserToXML_gui::ui($top);
ParserToXML_gui::run() if defined &ParserToXML_gui::run;

# Собстенно запускаем интерфейс
Tkx::MainLoop();


На ликусах не проверял, человеку нужен было под Windows.

Update
smile не знал, цензура работает, ###код -- это плохой код

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)