in reply to How to pass the value of a variable from a child to parent with gui interface?

Change:

use Win32::GUI(); my $text;

To:

use threads; use threads::shared; use Win32::GUI(); my $text :shared;

And see what happens.


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.
"I'd rather go naked than blow up my ass"

Replies are listed 'Best First'.
Re^2: How to pass the value of a variable from a child to parent with gui interface?
by ZJ.Mike.2009 (Scribe) on Mar 13, 2010 at 05:16 UTC

    BrowserUK, thanks for pointing out that Win32::GUI::Dialog() is actually a loop!

    I tried the following and it seems to almost get what I was expecting:

    while(1){ $display->Show(); $display->SelectAll(); $display->Clear(); $display->Update(); $display->Append($text); $display->Update(); sleep(10); } Win32::GUI::Dialog();

    The problem is: the cursor is always busy because of Win32::GUI::Dialog(); loop.

      The dialog call is now reduntant. Try this:

      use strict; use warnings; use threads; use threads::shared; use Win32::GUI(); my $text :shared; my @h = qw(LINE1 LINE2 LINE3 LINE4 LINE5); my $pid = fork(); if ($pid){ my $main = Win32::GUI::Window->new( -left => 100, -top => 100, -width => 310, -height => 150, ); $main->Show(); my $display = $main->AddTextfield( -left => 60, -top => 35, -width => 180, -height => 20, ); while(1){ $display->Show(); $display->SelectAll(); $display->Clear(); # $display->Update(); $display->Append($text); $display->Update(); sleep(1); } } elsif ($pid == 0) { while(1){ $text = "$h[int(rand(@h))]"; sleep(1); } }

      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.

        Yes, thanks, BrowserUK :)

        the dialog is unnecessary. Now the only problem is that using this approach to display dynamically changing content will cause the cursor to be always in the busy shape.

Re^2: How to pass the value of a variable from a child to parent with gui interface?
by ZJ.Mike.2009 (Scribe) on Mar 13, 2010 at 04:24 UTC

    BrowserUk, Thanks for the pointer. Now looks like the value of $text can successfully be passed to the parent at some point. But somehow this $text is not dynamically changing. I'm expecting $text can be dynamically displayed and that's why I created two infinite loops in both child and parent.

    Anyway, thanks again :)

      The problem is, this Win32::GUI::Dialog(); is a loop. It doesn't return until you do something on the dialog. If you click the close button on the dialog a few times, you'll see that the child is indeed running its loop.

      But until you understand how Win32::GUI works, trying to write multi-threaded apps using it is going to be a frustrating exercise.


      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.
        BrowserUk, wow, you're right, yes, yes, $text changes when the close button is clicked a couple of times :)