Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Отслеживание запущенных процессов windows


Автор: birdfree 12.6.2010, 18:14
Доброго времени суток! 
Помоги начинающему программисту Perl.
Мне требуется при запуске скрипта отслеживать не запущены процессы типа Word.exe, Exel.exe а если процессы запущены то дожно выдаваться стандартный виндовкий MsgBox сто запущен процесс  

Автор: NuINu 13.6.2010, 00:04
начинающему перл программисту рекомендую Линукс )

Автор: birdfree 13.6.2010, 03:08
уважаемый NuINu, обращаю внимание что мне нужен именно Windows

Автор: dva300 13.6.2010, 13:28
Цитата(birdfree @ 12.6.2010,  18:14)
Доброго времени суток! 
Помоги начинающему программисту Perl.
Мне требуется при запуске скрипта отслеживать не запущены процессы типа Word.exe, Exel.exe а если процессы запущены то дожно выдаваться стандартный виндовкий MsgBox сто запущен процесс

Win32::Process для процессов
на Tk нарисуешь окошко.

только не пойму зачем тут Perl тем более если есть такие сложности. Возьмите Delphi лучше или еще чего.

Автор: birdfree 13.6.2010, 15:03
dva300, а что есть Tk? 
А нельзя ли не большой примерчик с win32::process, просто честно говоря я в перле не айс а мне надо срочно написать на нем приложение, а у меня осталось в нем только две проблемы, в том числе и эта

Автор: dva300 13.6.2010, 15:17
Цитата(birdfree @ 13.6.2010,  15:03)
dva300, а что есть Tk? 
А нельзя ли не большой примерчик с win32::process, просто честно говоря я в перле не айс а мне надо срочно написать на нем приложение, а у меня осталось в нем только две проблемы, в том числе и эта

Tk - http://search.cpan.org/~ni-s/Tk-804.027/pod/UserGuide.pod
win32::process - http://search.cpan.org/search?query=win32%3A%3Aprocess&mode=all

там есть и примеры.

Цитата

просто честно говоря я в перле не айс а мне надо срочно написать на нем приложение


ну вот я и говорю - зачем Perl ? пишите на то что знаете.

Автор: dva300 13.6.2010, 15:37
Цитата(birdfree @ 13.6.2010,  15:03)
dva300, а что есть Tk? 
А нельзя ли не большой примерчик с win32::process, просто честно говоря я в перле не айс а мне надо срочно написать на нем приложение, а у меня осталось в нем только две проблемы, в том числе и эта

ну вот на быструю руку примерно так - пример для определения запуска Excel.
дальше уж сами дорабатывайте.

Код

use strict;
use Win32::Process::Info;
use Tk;

 my $pi = Win32::Process::Info->new ();
 my @info = $pi->GetProcInfo ();   

 foreach (@info)
    {
    while (my ($key,$value) = each(%$_))
        {
        if ($value =~ /excel/i)
            {
            my $mw = MainWindow->new;
            $mw->geometry("200x100");
            $mw->title("Excel started !!!");
            $mw->Label(-text => 'Excel started !!!')->pack();
            $mw->Button(-text => "Close", -command =>sub{exit})->pack();
            MainLoop;
            }
        }
    }


Автор: birdfree 13.6.2010, 16:34
dva300, Большое вам спасибо за пример!

Автор: dva300 13.6.2010, 16:39
Цитата(birdfree @ 13.6.2010,  16:34)
dva300, Большое вам спасибо за пример!

чем могу 
заработал ? 

Автор: birdfree 13.6.2010, 18:46
Да, все работает спасибо. Мне только пришлось не много переписать под Tkx но это мелочи, почему то у моего перла от активстэйт нет такого пакета как Tk получилось это
Код

use strict;
use Win32::Process::Info;
use Tkx;
my $pi   = Win32::Process::Info->new();
my @info = $pi->GetProcInfo();
foreach (@info) {
    while ( my ( $key, $value ) = each(%$_) ) {
        if ( $value =~ /notepad/i ) {
   my $mw = Tkx::widget->new(".");
   
   $mw->g_wm_title("Error");
   my $b = $mw->new_button(
        -text => "Close",
        -command => sub { $mw->g_destroy; },
    );
    $b->g_pack;

            Tkx::MainLoop();
        }
    }
}
print " OK!\n";

Автор: birdfree 14.6.2010, 05:15
в общем то все работает, осталась проблема наведения лоска так сказать вот код
Код

use strict;
use Win32::Process::Info;
use Tkx;
use Net::FTP;
use Encode 'encode', 'decode';

my $pi   = Win32::Process::Info->new();
my @info = $pi->GetProcInfo();
foreach (@info) {
    while ( my ( $key, $value ) = each(%$_) ) {
        if ( $value =~ /word/i ) {
   my $mw = Tkx::widget->new(".");

   $mw->g_wm_title(decode('cp1251', 'ќшибка!'));
   my $label = $mw->new_ttk__label(
   -text => decode('cp1251', '«акройте word!'),
           -font => "Arial_Black",
   -foreground => "red");
      my $label2 = $mw->new_ttk__label(
   -text => decode('cp1251', '» запустите снова.'),
           -font => "Arial_Black",
   -foreground => "red");
      my $b = $mw->new_button(
        -text => decode('cp1251', 'ѕродолжить'),
        -command => sub {
         print "oo\n";},
    );
    $b->g_pack;
   my $b2 = $mw->new_button(
        -text => decode('cp1251', '¬ыйти'),
        -command => sub { $mw->g_destroy; },
    );
    $b2->g_pack;

            Tkx::grid($label, -row => 0, -column => 0, -padx => 10, -pady => 10);
            Tkx::grid($label2, -row => 1, -column => 0, -padx => 10, -pady => 10);
#            Tkx::grid($b, -row => 1, -column => 0, -padx => 10, -pady => 10);
            Tkx::grid($b2, -row => 2, -column => 0, -padx => 10, -pady => 10);
            
            Tkx::MainLoop();
        }
    }
}

print "OK!\n";
#  тут программа
print "OK!\n"


собственно если в памяти нет нужного процесса ты программа прекрасно работает себе дальше и выполняет требуемые действия, еще я добавил кнопочку продолжить, то есть когда нажимаем эту кнопку то снова происходит проверка на наличие процесса и если процесса в памяти нет то выполняется программа дальше, вот только одна загвоздочка, только вот в чем проблема у меня это не получается реализовать, конечно может я спинным мозгом думаю но что то не получается, помогите пожалуйста 

Автор: shamber 14.6.2010, 10:57
Цитата(birdfree @  14.6.2010,  05:15 Найти цитируемый пост)
дальше, вот только одна загвоздочка, только вот в чем проблема у меня это не получается реализовать, конечно может я спинным мозгом думаю но что то не получается, помогите пожалуйста  

мозг сломлен... может проще сформулируете?

Автор: birdfree 14.6.2010, 11:16
Цитата(shamber @ 14.6.2010,  10:57)
Цитата(birdfree @  14.6.2010,  05:15 Найти цитируемый пост)
дальше, вот только одна загвоздочка, только вот в чем проблема у меня это не получается реализовать, конечно может я спинным мозгом думаю но что то не получается, помогите пожалуйста  

мозг сломлен... может проще сформулируете?

Мой Моск, во время написания был практически мертв, щас чуть по лучше. Попробую сформулировать свои мысли четко.
1. Есть цикл, в котором происходит проверка на существование процесса в памяти
2. Если процесс не найден, собственно программа выполняется дальше 
3. Если процесс найден, выдается окно с предупреждением и двумя кнопками, "Выйти" из приложения и "Продолжить"
4. Если нажать кнопку "Продолжить" то мы должны вернуться к пункту 1.  
Собственно не могу реализовать пункт 4.

Автор: shamber 14.6.2010, 13:43
у вас цикл заканчивается, когда закончились данные в массиве info...
Выход из ситуации очевиден. вам при нажатии кнопки продолжить, нужно добавить значений в этот массив.

Добавлено через 4 минуты и 2 секунды
birdfree, а вообще програмка у вас криво написана. вам бы разнести создание "окна" и код "сканирующий" наличие окна. а тоу  вас там каша

Автор: birdfree 14.6.2010, 15:28
Уважаемый shamber, как я уже говорил в перле я крайне плохо понимаю, если вас не затруднит не могли бы привести пример.

Автор: dva300 14.6.2010, 17:12
Цитата(birdfree @ 14.6.2010,  15:28)
Уважаемый shamber, как я уже говорил в перле я крайне плохо понимаю, если вас не затруднит не могли бы привести пример.

birdfree вы не злитесь. просто вы в данном случае меня, например, поймите - попахивает тем что нужно просто взять и написать программу за вас. а это не дело. 
если вы начинающий то это скорее плюс нежели минус - стремитесь что-то новое постичь. задачи достаточно простые да и направление вам указывают верное.

Автор: shamber 14.6.2010, 19:42
Tkx это ужос smile блин попытался запустить скрипт не вышло smile отвык я от них

Автор: dva300 14.6.2010, 20:02
Цитата(shamber @ 14.6.2010,  19:42)
Tkx это ужос smile блин попытался запустить скрипт не вышло smile отвык я от них

 smile 
и это все для рисования одного окошка 

Автор: shamber 14.6.2010, 21:19
я проверить не смог, а вы попытайтесь, особенно если у вас окошко нормально рисуется. Перед вызовом my @info = $pi->GetProcInfo(); просто добавьте бесконечный цикл while(1). Это позволит вам продолжить поиск нужного окошка.

Автор: birdfree 14.6.2010, 21:27
shamber, я пробовал ставить бесконечный цикл не получилось. По этому и обратился зп помощью.
dva300, я понимаю что это выглядит не очень хорошо, я вам крайне благодарен за помощь. Я постараюсь в дальнейшем разбираться самостоятельно.  smile 

Автор: dva300 14.6.2010, 22:11
Цитата(birdfree @ 14.6.2010,  21:27)
shamber, я пробовал ставить бесконечный цикл не получилось. По этому и обратился зп помощью.
dva300, я понимаю что это выглядит не очень хорошо, я вам крайне благодарен за помощь. Я постараюсь в дальнейшем разбираться самостоятельно.  smile

birdfree когда видно что человек стремиться то и помогается легче. 
боритесь  я готов вам помогать 

Автор: birdfree 15.6.2010, 11:45
shamber, я пробовал ставить бесконечный цикл не получилось. По этому и обратился зп помощью.
dva300, я понимаю что это выглядит не очень хорошо, я вам крайне благодарен за помощь. Я постараюсь в дальнейшем разбираться самостоятельно.  smile 

Автор: dva300 15.6.2010, 14:39
Цитата(birdfree @ 15.6.2010,  11:45)
shamber, я пробовал ставить бесконечный цикл не получилось. По этому и обратился зп помощью.
dva300, я понимаю что это выглядит не очень хорошо, я вам крайне благодарен за помощь. Я постараюсь в дальнейшем разбираться самостоятельно.  smile

а чего дважды то повторять ?  smile 

ниже код согласно твоих условий. пока будешь жать "Да" программа будет проверять наличие процесса в системе. Если процесс исчезнет - продолжиться выполнение программы. Нажмешь "Нет" - программа завершиться.

P.S. Извини. на Tkx сам перепишешь  smile  

Код

use strict;
use Win32::Process::Info;
use Tk;

 my $pi = Win32::Process::Info->new ();
 my $flag = 1;
 while($flag)
    {
    $flag = undef;
    my @info = $pi->GetProcInfo ();   
    foreach (@info)
        {
        while (my ($key,$value) = each(%$_))
            {
            if ($value =~ /excel/i)
                {
                my $mw = MainWindow->new();
                $mw->withdraw();

                my $ftp_warn = $mw->messageBox(
                -title   => 'Message',
                -message => "Excel found. Continue ?",
                -type    => 'YesNo',
                -icon    => 'question',
                );
                if ( $ftp_warn eq 'No' ) 
                    {
                    exit;
                    }
                else 
                    {
                    $flag = 1;
                    last;
                    }
                }
            }
        last if $flag;    
        }
    }
print "main programm....\n";    

Автор: birdfree 17.6.2010, 01:16
dva300, Спасибо вам большое, есче раз! 
Все оказалось просто, оказывается не умею пользоваться оператором last  smile  smile  smile 
Честно говоря, ту конструкцию что предложил, уважаемый dva300, я решил использовать с самого начала, я просто не умею пользоваться last  smile 

Автор: dva300 17.6.2010, 13:28
Цитата(birdfree @ 17.6.2010,  01:16)
dva300, Спасибо вам большое, есче раз! 
Все оказалось просто, оказывается не умею пользоваться оператором last  smile  smile  smile 
Честно говоря, ту конструкцию что предложил, уважаемый dva300, я решил использовать с самого начала, я просто не умею пользоваться last  smile

 smile  согласно диалога выше проблема как мне думалось была в цикле while 
программа будет и без last работать (за комментируйте и проверьте) только немного не правильно потому как....

Объясню зачем нужен last - т.к. в задаче не стоит условие количественного определения запущенных процессов т.е. массив @info пробегать весь не надо
поэтому мы ввели признак $flag который станет правдой как только первое упоминание об интересующих нас процессах будет найдено. оно же есть условие выхода и из глобального цикла while.
как только значение найдено - выходим из циклов и обновляем массив @info новыми данными и повторяем все заново.
 
как видите цикл foreach и вложенный while по хешам можно и не прерывать - просто придется еще пару раз нажать на кнопку "Далее"
хотя это естественно не правильно потому как процессов в системе больше нет. для этого и нужен last.

Автор: birdfree 17.6.2010, 13:54
Цитата(dva300 @ 17.6.2010,  13:28)

Объясню зачем нужен last - т.к. в задаче не стоит условие количественного определения запущенных процессов т.е. массив @info пробегать весь не надо
поэтому мы ввели признак $flag который станет правдой как только первое упоминание об интересующих нас процессах будет найдено. оно же есть условие выхода и из глобального цикла while.
как только значение найдено - выходим из циклов и обновляем массив @info новыми данными и повторяем все заново.
 
как видите цикл foreach и вложенный while по хешам можно и не прерывать - просто придется еще пару раз нажать на кнопку "Далее"
хотя это естественно не правильно потому как процессов в системе больше нет. для этого и нужен last.

Вот у меня как раз в этом и была проблема, что я не мог сделать выход из цикла, все срабатывало но из цикла он не выходил. Большое спасибо! 

Автор: dva300 17.6.2010, 14:08
Цитата

Большое спасибо!

Большое пожалуйста  smile 

что хоть за задача была ? а то мы как китайские программисты - пишем часть не понимая что есть целое smile
P.S. надеюсь задача была не просто вывести кнопку на экран  smile 

Автор: birdfree 17.6.2010, 18:03
Программа вытаскивала из 1с данные потом преобразовывала, туда добавлялись, данные из exel, в итоге все выкладывалось по фтп на сервера, в общем то это все автоматизированно, графический интерфейс создан для отлова ошибок при работе с отображением у оператора на экране ))) ВОт такая вот не хитрая программа )) 

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