[Gtk-sharp-list] GTK# Window Display Issue Outside of Main.cs
Andres G. Aragoneses
knocte at gmail.com
Wed Nov 7 00:53:15 UTC 2012
And a good tool to fix what just Joe brought up is:
https://github.com/slluis/gui-thread-check
This tool will, furthermore, be bundled by default in the next 2.99.1
release (so one more incentive to upgrade ).
On 06/11/12 22:37, Joe Dluzen wrote:
> Though I haven't run your code, my first guess would be threading
> issues. As with practically all GUI toolkits, components are not only
> not threadsafe, but code doing anything with the components must be
> invoked on the same thread, please see here:
> http://www.mono-project.com/Responsive_Applications
>
> In the code you have not posted, is anything started on new threads, or
> on the threadpool? If so, you'd need to Invoke() any and all update code
> to the GUI thread. All speculation right now, sorry.
>
> Joe
>
>
> On Tue, Nov 6, 2012 at 2:36 PM, Johnnie Odom <jodom at escambia.k12.fl.us
> <mailto:jodom at escambia.k12.fl.us>> wrote:
>
> Hello Everyone,
>
>
> This is my first day on the mailing list, and as it is I have a
> question regarding some odd behavior I am encountering.
>
>
> I am writing an application on OS X 10.8 using C#, Mono 2.10.9 and
> MonoDevelop 3.0.4 (including the Designer views) that makes some
> simple changes to LDAP. As part of it, I decided to get fancy with
> GTK#. All is going well, except for one behavior.
>
>
> I have created a window class to display a progress bar and stop
> button. I have further created a function in this class to update
> the progress bar with a fraction and text message. In my code, I
> create a new instance of this window class when real work is
> happening in another class, and then populate it after every ten
> iterations of a foreach loop.
>
>
> My problem is that when the window is created FROM THE CLASS DOING
> REAL WORK, it displays neither the progress bar widget, nor the
> button. It displays only the window title and then white space
> below. Only this window displays this behavior -- several other
> windows that I create over the course of the application all display
> appropriately.
>
>
> If I instead create the progress bar window in Main.cs and call
> Show(), it will display just fine. I can even call the function to
> set its status from Main.cs and it will display correctly.
>
>
> I have tried creating the window in Main.cs and passing it to the
> class that does the real work later. I have tried creating it in
> other classes besides the one that does the work. In all cases the
> behavior is the same -- if the window is created and used solely in
> Main.cs it will display fine, but if it it ever invoked or created
> from anywhere else (whether or not it is created in another class or
> in Main.cs) it will display incorrectly.
>
>
> I have taken to using the debugger and break points to isolate the
> behavior. If I set a breakpoint immediately after the window is
> created, it is still blank -- that is, I do not think it is a case
> that the window is just not keeping pace with any updates I am
> sending. I have also compared the various values of the window
> objects and attributes when it is displayed (created and used solely
> in Main.cs) and when it is not (displayed in any other class) and
> they seem to be identical.
>
>
> So, I am at a loss, and I would appreciate any advice you might give.
>
>
> I can send any code you think would prove useful, but for now I am
> sending you the class where I am trying to call the window, and the
> contents of the window's code-behind.
>
>
> Thank you for any guidance you can give.
>
>
> Johnnie Odom
>
> Network Services
>
> School District of Escambia County
>
>
> ****************
>
>
> The function from the calling class:
>
> public string radiazerMain(string radiazerGroup, string
> radiazerProfile){
>
> Progression MarathonBar = new Progression();
>
> MarathonBar.Show();
>
> string monologger = "";
>
> string lastLine = "Radiazer completed current run." +
> Environment.NewLine;
>
> Array usersToModify = getGroupMembers(radiazerGroup);
>
> string[] radiusAttribs = new
> string[]{"dialupAccess","radiusArapFeatures","radiusArapSecurity","radiusArapZoneAccess","radiusAuthType","radiusCallbackId","radiusCallbackNumber","radiusCalledStationId","radiusCallingStationId","radiusCheckItem","radiusClass","radiusClientIPAddress","radiusExpiration","radiusFilterId","radiusFramedAppleTalkLink","radiusFramedAppleTalkNetwork","radiusFramedAppleTalkZone","radiusFramedCompression","radiusFramedIPAddress","radiusFramedIPNetmask","radiusFramedIPXNetwork","radiusFramedMTU","radiusFramedProtocol","radiusFramedRoute","radiusFramedRouting","radiusGroupName","radiusHint","radiusHuntgroupName","radiusIdleTimeout","radiusLoginIPHost","radiusLoginLATGroup","radiusLoginLATNode","radiusLoginLATPort","radiusLoginLATService","radiusLoginService","radiusLoginTCPPort","radiusLoginTime","radiusPasswordRetry","radiusPortLimit","radiusProfileDn","radiusPrompt","radiusProxyToRealm","radiusRealm","radiusReplicateToRealm","radiusReplyItem","radiusServiceType","radiusSessionTimeout",
"radiusSimultaneousUse","radiusStripUserName","radiusTerminationAction","radiusTunnelAssignmentId","radiusTunnelClientEndpoint","radiusTunnelMediumType","radiusTunnelPassword","radiusTunnelPreference","radiusTunnelPrivateGroupId","radiusTunnelServerEndpoint","radiusTunnelType","radiusUserCategory","radiusVSA"};
>
>
> LdapAttributeSet profileTemplate =
> LdapAttributeSetFiltered(radiazerProfile, radiusAttribs);
>
> profileTemplate.Add(new LdapAttribute("radiusProfileDn",
> radiazerProfile));
>
>
> int totalUsersCount = usersToModify.Length;
>
> int currentUserCount = 0;
>
> int errorCount = 0;
>
> MarathonBar.Show();
>
>
> foreach(string userToModify in usersToModify){
>
> currentUserCount++;
>
> try{
>
> monologger = monologger + radiazeModifyUser(userToModify,
> profileTemplate);
>
> }
>
> catch(LdapException LdapFailure){
>
> monologger = monologger + "User " + userToModify + " failed. Error
> is " + LdapFailure.ToString() + Environment.NewLine;
>
> errorCount++;
>
> }
>
> if(((currentUserCount % 10) == 0) || ((totalUsersCount -
> currentUserCount) < 10)){
>
> MarathonBar.setProgress(((double)currentUserCount /
> totalUsersCount), totalUsersCount , currentUserCount, errorCount,
> userToModify);
>
> }
>
> if(MarathonBar.cancelFromUser){
>
> lastLine = "Radiazer cancelled by user." + Environment.NewLine;
>
> break;
>
> }
>
> }
>
>
> MarathonBar.Destroy();
>
> monologger = monologger + lastLine;
>
> return monologger;
>
> }
>
>
> *************
>
>
> The Code-Behind:
>
>
> using System;
>
>
> namespace Radiazer2
>
> {
>
> public partial class Progression : Gtk.Window
>
> {
>
>
> public bool cancelFromUser = false;
>
>
> public Progression () :
>
> base(Gtk.WindowType.Toplevel)
>
> {
>
> this.Build ();
>
> }
>
>
> public void setProgress(double fractionOfProgress, int totalUnits,
> int finishedUnits, int errorUnits, string finishedUser){
>
> this.progressIndicator.Fraction = fractionOfProgress;
>
> this.progressIndicator.Text = "Completed " + finishedUnits + " of "
> + totalUnits + " with " + errorUnits + " errors. Current user is " +
> finishedUser + ".";
>
> }
>
>
> protected void OnStopUserClicked (object sender, EventArgs e)
>
> {
>
> cancelFromUser = true;
>
> }
>
More information about the Gtk-sharp-list
mailing list