in reply to Re^2: Win32 GUI Window Problem
in thread Win32 GUI Window Problem

It seems that it has to do with the windows automatically terminating at the completion of the foreach loop. Any ideas for fixing this? All comments, advice and ideas are greatly appreciated. And a big thank you to BrowserUk for your advice.

Replies are listed 'Best First'.
Re^4: Win32 GUI Window Problem
by Acid Amygdala (Novice) on Jan 28, 2009 at 02:13 UTC
    Here is the revised version of the code, which now keeps the windows up:
    $filename="log3.txt"; open(TXT, $filename)||die("Could not open file!"); @filedata = <TXT>; close TXT; close TXT; open (TXT, ">$filename"); @alert = ['a'..'z']; $i=0, $p=1; while(@filedata || !@filedata) { if($filedata[0] =~ /(\s+)(\d{1,4})(\.\d{1,4}){3}(\s+)/) { &Build_Window; } shift(@filedata); ++$i; ++$p; if(!@filedata) { open(TXT, $filename)||die("Could not open file!"); @filedata = <TXT>; close TXT; open (TXT, ">$filename"); close TXT; &Loop; } } Win32::GUI::Dialog(); sub Loop { if($filedata[0] =~ /(\s+)(\d{1,4})(\.\d{1,4}){3}(\s+)/) { &Build_Window; Win32::GUI::Dialog(); } shift(@filedata); ++$i; ++$p; if(!@filedata) { open(TXT, $filename)||die("Could not open file!"); @filedata = <TXT>; close TXT; open (TXT, ">$filename"); close TXT; &Loop; } } sub Build_Window { $datetime = localtime(); $alert[$i] = new Win32::GUI::Window(-name => "Alert", -width = +> 500, -height => 150, -pos => [$p*2, $p*2]); $font = Win32::GUI::Font -> new(-name => "Arial", size => 46, +-bold => 1); $alert[$i] -> AddLabel(-text => $datetime, -font => $font); $alert[$i] -> AddLabel(-text => "SNORT ALERT: MALICIOUS BEHAVI +OR DETECTED!", -font => $font, -top => 50); $alert[$i] -> AddLabel(-text => $filedata[0], -font => $font, +-top => 75); my $t1 = $alert[$i] -> AddTimer('T1', 1000); Win32::Sound::Play("SystemExclamation"); $alert[$i] -> Show(); Win32::GUI::Dialog(); sub T1_Timer { return -1; } sub Alert_Terminate { return 1; } }
    The problem I have now is that only the first set of windows (the data that was first wrote to the log file) appears. Does anyone have any thoughts on this?

      You'd get better responses if your code showed some semblence of effort. A few questions:

      1. Why are you initialising @alerts with an anonymous array containing the characters 'a'..'z'?
      2. Why do you have two subroutines embedded within a subroutine?
      3. What it sub T1_Timer() meant to achieve?
      4. Why aren't you using strict?
      5. How is sub Loop() ever meant to be run?
      6. Why are you closing the file twice?
      7. Why do you then reopen it for output and never close it?

      Anyway, try this:

      #! perl -slw use strict; use Win32::GUI(); use Win32::Sound; my $filename="yourfile.dat"; open(TXT, $filename)||die("Could not open file!"); my @filedata = <TXT>; close(TXT); my( $running, @alerts ) = 0; my $p = 100; for my $element ( @filedata ) { if( $element =~ /(\s+)(\d{1,4})(\.\d{1,4}){3}(\s+)/) { push @alerts, Build_Window( $element, $p += 10 ); ++$running; } } sub Alert_Terminate { return --$running ? 1 : -1; } sub Build_Window { my( $element, $pos ) = @_; my $win = new Win32::GUI::Window( -name => "Alert", -width => 500, -height => 150, -pos => [ $pos, $pos ] ); my $font = Win32::GUI::Font->new( -name => "Arial", size => 46, -bold => 1 ); $win->AddLabel(-text => localtime(), -font => $font); $win->AddLabel( -text => "SNORT ALERT: MALICIOUS BEHAVIOR DETECTED!", -font => $font, -top => 50 ); $win->AddLabel(-text => $element, -font => $font, -top => 75); Win32::Sound::Play("SystemExclamation"); $win->Show(); return $win; } Win32::GUI::Dialog();

      But be aware, your apparent lack of understanding, and of effort to understand, means that you are going to have to start reading some documentation, and try to develop your understanding by writing a few simple (non-GUI) programs, before you will get further help from me.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Thank you once again BrowserUk, I think I can do this on my own now. I realize now that although I tried to understand, my attempts are not up to par with perlmonks users, so I'm going to go get this fixed on my own no matter how long it takes. Like they say, you just gotta keep at it. But I appreciate all of the help that perlmonks users have offered me. Hasta luego, PerlMonks, and happy coding.