Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос для ГУРУ Perl 
:(
    Опции темы
wolter
Дата 2.2.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 28.1.2008

Репутация: нет
Всего: нет



есть вот такой простенький код
Код

use strict;
use Win32::GUI;

my $main = Win32::GUI::Window->new(
    -name    => "Main",
    -title   => "Win32-GUI: Doevents-Demo",
    -left    => 100,
    -top     => 100,
    -width   => 600,
    -height  => 400,
  );

sub Main_Terminate() {
    print "Main window terminated\n";
    return -1;
}

my $textfield1 = $main->AddTextfield(
    -name   => "Textfield1",
    -text   => "Text field 1",
    -left   => 1,
    -top    => 1,
    -width  => 100,
    -height => 20,
    -readonly => 0,
);

my $textfield2 = $main->AddTextfield(
    -name   => "Textfield2",
    -text   => "Text field 2",
    -left   => 1,
    -top    => 20,
    -width  => 100,
    -height => 20,
    -readonly => 0,
);

my $textfield3 = $main->AddRichEdit(
    -name   => "Textfield3",
    -text   => "Text field 3",
    -left   => 1,
    -top    => 40,
    -width  => 200,
    -height => 60,
    -readonly => 0,
);

$main->Show();

my $con1 = 0;
my $con2 = 0;

while (1) {
$con1++;
$textfield1->Text("Text field 1 $con1");
Win32::GUI::DoEvents() >= 0 or die "Window was closed during processing";
sleep (3);
}

while (1) {
$con2++;
$textfield2->Text("Wait namber 2 $con2");
Win32::GUI::DoEvents() >= 0 or die "Window was closed during processing";
sleep (5);
}

Win32::GUI::DoEvents();
Win32::GUI::Dialog();

Задача такая надо чтобы в тексовых полях 1 и 2 обновлялялись данные не зависимо друг от друга, но с разной задержкой и при это чтобы в текстовом поле 3 можно было без лагов и задержок чегото набирать
Почему то у меня висне пообще все окно программы и обновляеться только 1 первое текстовое поле
Подскажите как выйти из ступора и заставить выполнять разные куски кода с разной хадержкой и при этом не вгонять в ступор главнй интерфейс программы
PM MAIL   Вверх
wolter
Дата 4.2.2008, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 28.1.2008

Репутация: нет
Всего: нет



ну неужели никто не знает решение данной проблеммы решаемой на Перл? smile  smile  smile 
PM MAIL   Вверх
wolter
Дата 4.2.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 28.1.2008

Репутация: нет
Всего: нет



люди ну кто нить ПОМОГИТЕ !!! smile  smile  smile  smile  smile  smile 
PM MAIL   Вверх
vadiml
Дата 4.2.2008, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



тут очень мало кто использует win32

попробуй тоже самое сделать на С и сверь результат

PM MAIL Jabber   Вверх
wolter
Дата 4.2.2008, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 28.1.2008

Репутация: нет
Всего: нет



Ой спасибо,неужели вы думатет что если бы у меня был выбор на чем писать я бы писал на перл !?
PM MAIL   Вверх
shamber
Дата 5.2.2008, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



wolter, А вот у меня есть выбор и я пишу на perl smile
PM MAIL Jabber   Вверх
sir_nuf_nuf
Дата 5.2.2008, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



 smile 

Дорогой друг! тут дело не в перле, а многопоточности.
По только что прочитанному мануалу по Tk надо делать так:
1) посоздавать всяких окон и т.п.
2) запусить MainLoop();  # прямо так по ходу и называется

GUI работает как - Tk генерирует события, например нажата кнопка, или введен символ в 
ваш RichEdit (тоже кнопка =)) и потом вызывает обработчики  , написанные вами.


писать циклы типа

Код

while (1) {
$con1++;
$textfield1->Text("Text field 1 $con1");
Win32::GUI::DoEvents() >= 0 or die "Window was closed during processing";
sleep (3);
}

while (1) {
$con2++;
$textfield2->Text("Wait namber 2 $con2");
Win32::GUI::DoEvents() >= 0 or die "Window was closed during processing";
sleep (5);
}


бессмысленно, потому что
а) обработка eventов GUI будет происходить раз в 3 секунды (мило, да ?)
б) второй цикл никогда не будет запущен (без комментариев)

Лучше сделать так
1) либо завести отдельный thread(или даже 2 - по одному на textbox), который будет обновлять ваши textbox
2) либо (не знаю как делать это в Perl /Tk) переопределить функцию отрисовки, в которой
будет в каждый момент выводиться нужное число. хотя вариант 1 все таки лучше.

3) подумать, а что же вам действительно нужно.. просто не вижу способа применить такие textbox.
возможно их нужно обновлять не постоянно, а например при вводе данных в richedit ? тогда имеет смысл повесить
обработчик на textbox


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
KSURi
Дата 5.2.2008, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Цитата(sir_nuf_nuf @  5.2.2008,  10:43 Найти цитируемый пост)
1) либо завести отдельный thread(или даже 2 - по одному на textbox), который будет обновлять ваши textbox

Tk, наскольк я знаю, имеет статус thread unsafe, так что врядли такой финт получится (я как-то пробовал, но сильно не заморачивался). Хотя по здравому смыслу - это самое правильное решение имхо.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
wolter
Дата 5.2.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 28.1.2008

Репутация: нет
Всего: нет



Цитата(sir_nuf_nuf @ 5.2.2008,  10:43)
smile 
Лучше сделать так
1) либо завести отдельный thread(или даже 2 - по одному на textbox), который будет обновлять ваши textbox
2) либо (не знаю как делать это в Perl /Tk) переопределить функцию отрисовки, в которой
будет в каждый момент выводиться нужное число. хотя вариант 1 все таки лучше.

3) подумать, а что же вам действительно нужно.. просто не вижу способа применить такие textbox.
возможно их нужно обновлять не постоянно, а например при вводе данных в richedit ? тогда имеет смысл повесить
обработчик на textbox

Полностью согласен с вориантом 1, содержымое текстовых полей долно обновляться постоянно  с момента запуска программы и до ее завершения, но это делать они должны независимо друг от друга(я не когда не работал с многопочностью, поэтому буду искренне благодарен за пример smile )
цыклы while, були указанны как пример.

Добавлено через 4 минуты и 39 секунд
Люди причем тут Tk это все реализаванно пи помощи Win32::GUI
PM MAIL   Вверх
PanamOS
Дата 5.2.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.1.2008

Репутация: нет
Всего: нет



Цитата(wolter @  5.2.2008,  14:53 Найти цитируемый пост)
Люди причем тут Tk это все реализаванно пи помощи Win32::GUI 

Tk привели лишь как пример, для Win32::GUI надо смотреть документацию или просто пробовать. В Wx это точно реализуемо. На сайте есть демо-примеры, где показано как это использовать.
PM MAIL   Вверх
wolter
Дата 5.2.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 28.1.2008

Репутация: нет
Всего: нет



PanamOS,  А можно прямой линк на этот пример ?
PM MAIL   Вверх
PanamOS
Дата 5.2.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.1.2008

Репутация: нет
Всего: нет



wolterтут
Но перед этим установите себе Wx. Cсылку где его можно скачать я давал выше.
PM MAIL   Вверх
PanamOS
Дата 5.2.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.1.2008

Репутация: нет
Всего: нет



Что-то мне подсказывает, что Win32::GUI::Timer сгодиться.
PM MAIL   Вверх
vadiml
Дата 5.2.2008, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



неужели вы думате что если бы у меня был выбор на чем писать я бы писал на перл

я что-то сделал не так, когда несколько лет назад САМ взялся за перл? smile

PM MAIL Jabber   Вверх
PanamOS
Дата 5.2.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.1.2008

Репутация: нет
Всего: нет



Цитата(vadiml @  5.2.2008,  16:33 Найти цитируемый пост)
я что-то сделал не так, когда несколько лет назад САМ взялся за перл? smile

Ну если человек хорошо знает Delphi/C++, то рисовать окошки было бы удобнее(да и логичнее) не на перле.
PM MAIL   Вверх
wolter
Дата 5.2.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 28.1.2008

Репутация: нет
Всего: нет



Люди ну есть кто знает покажите пример
главное окно программы
в ней 2 текстовых поля
в первов обновляються данный с задержкой 3 сек
во втором с задержкой 5 
независемо друг от друга smile  smile  smile  smile 

PM MAIL   Вверх
wolter
Дата 5.2.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 28.1.2008

Репутация: нет
Всего: нет



Вот, нашел, и всегото делов

Код

#!/usr/bin/perl
use strict;
use Win32::GUI;
use threads;

my $main = Win32::GUI::Window->new(
    -name    => "Main",
    -title   => "Win32-GUI: Doevents-Demo",
    -left    => 100,
    -top     => 100,
    -width   => 200,
    -height  => 130,
  );



my $textfield1 = $main->AddTextfield(
    -name   => "Textfield1",
    -text   => "Text field 1",
    -left   => 0,
    -top    => 1,
    -width  => 100,
    -height => 20,
    -readonly => 0,
);

my $textfield2 = $main->AddTextfield(
    -name   => "Textfield2",
    -text   => "Text field 2",
    -left   => 0,
    -top    => 20,
    -width  => 100,
    -height => 20,
    -readonly => 0,
);

my $textfield3 = $main->AddRichEdit(
    -name   => "Textfield3",
    -text   => "Text field 3",
    -left   => 0,
    -top    => 40,
    -width  => 200,
    -height => 60,
    -readonly => 0,
);

$main->Show();

my $con1 = 0;
my $con2 = 0;

my $thread  = threads->create(\&rr);
my $thread2  = threads->create(\&rr2);

Win32::GUI::DoEvents();
Win32::GUI::Dialog();
$thread->join;


sub rr{
while (1) {
$con1++;
$textfield1->Text("Text field1 $con1");
Win32::GUI::DoEvents() >= 0 or die "Window was closed during processing";
sleep (1);
 }
}

sub rr2{
while (1) {
$con2++;
$textfield2->Text("Text field2 $con2");
Win32::GUI::DoEvents() >= 0 or die "Window was closed during processing";
sleep (5);
 }
}

sub Main_Terminate() {
    print "Main window terminated\n";
    $thread->detach();
    $thread2->detach();
    return -1;
}

PM MAIL   Вверх
Ramirez
Дата 7.2.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 18.1.2005
Где: Moscow, ExUSSR

Репутация: 4
Всего: 5



эээ.... а зачем такие сложности? можно было просто в один while со sleep 1 сек все положить. и просто на каждом третьем проходе обновлять 1 поле на каждом пятом 2-е поле.... и евенты раз в секунду будут обрабатываться, что сведет лаги к минимуму....

а если у вас 10 полей будет, что 10 тредов? Круто, я уже себе представляю, если бы в win на каждый обновляемый элемент интерфейса тред создавался, мы бы все сейчас сидели бы за 10-процессорными машинами с терабайтами памяти, наверное... =)

Это сообщение отредактировал(а) Ramirez - 7.2.2008, 11:08
PM ICQ   Вверх
wolter
Дата 8.2.2008, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 28.1.2008

Репутация: нет
Всего: нет



Ramirez
А можно пример в студию!!!
PM MAIL   Вверх
shamber
Дата 8.2.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



wolter
примерно так

Код




my $count = 0; 

while (1) {
 if ( $count ==3) { #если мы тут то значит это 3 секунда
     $con1++
     $textfield1->Text("Text field1 $con1");
     Win32::GUI::DoEvents() >= 0 or die "Window was closed during processing";
}elsif( $count ==5){ #если мы тут то значит это 5 секунда
         $con2++
     $textfield2->Text("Text field1 $con2");
     Win32::GUI::DoEvents() >= 0 or die "Window was closed during processing";
$count =0; # сбрасываем счетчик :)
}else{#иначе просто увеличиваем.
      $count++;
}
sleep (1);#использование sleep не самый лучший вариант.
 }


писал прямо в форум. Win32::Gui не ставил потому не проверял. А так Все же начните думать а не просто copy-paste. Это не приведет к результатам.
PM MAIL Jabber   Вверх
wolter
Дата 8.2.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 28.1.2008

Репутация: нет
Всего: нет



shamber,  smile  Попробуй вот то что Вы написали приминить конкретно к моей задаче, и посмотрите что у Вас получиться.
PM MAIL   Вверх
shamber
Дата 11.2.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



wolter
ну запустите в отдельном треде smile и посмотрите smile а если отдельный тред не хочется ищите как избавиться от 
Код

sleep(1)
.

PM MAIL Jabber   Вверх
shamber
Дата 11.2.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Код

#!/usr/bin/perl
use strict;
use Win32::GUI();

my $interval = 3000; #время в мс, т.е 3 секунды
my $interval2 = 5000;

my $main = Win32::GUI::Window->new(
    -name    => "Main",
    -title   => "Win32-GUI: Timers",
    -left    => 100,
    -top     => 100,
    -width   => 200,
    -height  => 130,
    -onTimer => \&redraw_Timer, #указываем, какую процедуру вызывать при срабатывании таймера
  );

my $textfield1 = $main->AddTextfield(
    -name   => "Textfield1",
    -text   => "Text field 1",
    -left   => 0,
    -top    => 1,
    -width  => 100,
    -height => 20,
    -readonly => 0,
);

my $textfield2 = $main->AddTextfield(
    -name   => "Textfield2",
    -text   => "Text field 2",
    -left   => 0,
    -top    => 20,
    -width  => 100,
    -height => 20,
    -readonly => 0,
);

my $textfield3 = $main->AddRichEdit(
    -name   => "Textfield3",
    -text   => "Text field 3",
    -left   => 0,
    -top    => 40,
    -width  => 200,
    -height => 60,
    -readonly => 0,
);


my $con1 =1;
my $con2 = 1;

 #создаем два таймера и называем их уникальными именами, чтобы в будущем определять какой таймер сработал
$main->AddTimer( "first", $interval);
$main->AddTimer( "second", $interval2);


$main->Show();


Win32::GUI::Dialog();

sub Main_Terminate {
        -1;
}

sub redraw_Timer{
        my $self = shift;
# получаем имя таймера.
        my $timer_name = shift;
#выбираем что делать :)
        if ($timer_name eq 'first'){
            $con1++;
            $textfield1->Text("Text field $con1");
        }elsif($timer_name eq 'second'){
            $con2++;
            $textfield2->Text("Text field2 $con2");
        }
}



Пользуйте, проверяйте. Как видите без sleep и тредов.
З.Ы. пришлось Win32::GUI ставить smile
З.З.Ы тему можно переименовать чтобы в будущем людям искать проще было smile

Это сообщение отредактировал(а) shamber - 11.2.2008, 13:36
PM MAIL Jabber   Вверх
wolter
Дата 25.2.2008, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 28.1.2008

Репутация: нет
Всего: нет



shamber,  Этоже гениально smile  smile  smile  Огромное спасибо, я просто както раньше в этот не заглядывал
PM MAIL   Вверх
shamber
Дата 26.2.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



wolter, всегда пожалуйста. smile
PM MAIL Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1065 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.