views:

307

answers:

1

The following is the main body of code for an image resizer/compressor/uploader. This is my first silverlight project, and I am having trouble with the threading and gui updating as well as the webclient part, which does not function.The resizing and resampling seem to perform to my knowledge. The problem is the gui updating and uploading. Hopefully I have provided enough information for you to understand what is happening.

If you would like to help me, and require further info, I can email you the project in a zip at your request, minus the sensitive code.

Your help is appreciated.

 namespace ulx
 {
    public partial class Page : UserControl
{

    public Page()
    {
        InitializeComponent();
        //Import images from file browse dialog
        this.Browse.Click += ImportFiles;
        this.thw.Text = "0";
        this.thh.Text = "0";
        this.rh.Text = "0";
        this.rw.Text = "0";
        this.Exec.IsEnabled = false;
        //Invoke the resize/compressions/uploader sequence
        this.Exec.Click += ExecP;
        this.mProgressBar.Visibility = Visibility.Collapsed;
        this.transc.Visibility = Visibility.Collapsed; 
    }

    public FileInfo [] Files;


    //select jpegs      
    public void ImportFiles(object sender,RoutedEventArgs e)
    {
        OpenFileDialog openDialog = new OpenFileDialog();
        openDialog.Filter = "JPEG Files (*.jpg;*.jpeg)|*.jpg;*.jpeg";
        openDialog.Multiselect = true; 
         if (openDialog.ShowDialog().GetValueOrDefault(false))
        {
            this.Files = (FileInfo [])openDialog.Files;             
            this.Imgcount.Text = "Image Count: "+this.Files.Length;

            this.Exec.IsEnabled = true;
        }   
    }


    public void ExecP(object Sender, RoutedEventArgs e)
    {
       //the main process 
       this.Process();

    }

    public void Process()
    {
            Configuration.thw = Convert.ToInt32(this.thw.Text);
            Configuration.thh = Convert.ToInt32(this.thh.Text);
            Configuration.rh = Convert.ToInt32(this.rh.Text);
            Configuration.rw = Convert.ToInt32(this.rw.Text);
            Configuration.dest = this.Dest.Text;
            if (Configuration.dest == "")
            {
                System.Windows.Browser.HtmlPage.Window.Alert("Invalid Dest:");
            }
            if (Configuration.thw == 0 || Configuration.thh == 0 || Configuration.rw == 0 || Configuration.rh == 0)
            {
                System.Windows.Browser.HtmlPage.Window.Alert("Invalid Resize Definitions");
                return;
            }
            //hide and disable a bunch of gui controls
            this.Browse.IsEnabled = false;
            this.thw.Visibility = Visibility.Collapsed;
            this.thh.Visibility = Visibility.Collapsed;
            this.rw.Visibility = Visibility.Collapsed;
            this.rh.Visibility = Visibility.Collapsed;
            this.c1.Visibility = Visibility.Collapsed;
            this.c2.Visibility = Visibility.Collapsed;
            this.c3.Visibility = Visibility.Collapsed;
            this.c4.Visibility = Visibility.Collapsed;
            this.Dest.Visibility = Visibility.Collapsed;
            this.transc.Visibility = Visibility.Visible;
            //enable and show progressbar
            this.mProgressBar.Visibility = Visibility.Visible;
            this.mProgressBar.Minimum = 0;
            this.mProgressBar.Maximum = this.Files.Length * 2;
            int i = 0;
            foreach (FileInfo file in this.Files)
            {
                //Resize thumb
             WriteableBitmap wb = null;
              this.transc.Text = "Creating Thumb (" + Configuration.thw + "," + Configuration.thh + ") :" + file.Name;

                using (FileStream stream = file.OpenRead())
                {
                    wb = ulxConverter.Imager.GetImageSource(stream, Configuration.thw, Configuration.thh);
                }
                string text = "";
                // compress thumb
                using (Stream Source = ulxUtil.JpgEncoder.Encode(wb, 50))
                {
                    StreamReader reader = new StreamReader(Source);
                    text = reader.ReadToEnd();
                }
                //upload thumb
                Thread.Sleep(1);
this.transc.Text = "Uploading Thumb: " + file.Name;
                Uploader tu = new Uploader("/cgi-bin/SIDES/ulx.cgi", "user", "pass", Configuration.dest, "" + file.Name, 1, text);
                Thread myThread = new Thread(new ThreadStart(tu.doit));
                myThread.Start();
this.mProgressBar.Value = i++;
this.transc.Text = "Creating Resample (" + Configuration.rw + "," + Configuration.rh + ") :" + file.Name;
                wb = null;
                //create resample
                using (FileStream stream = file.OpenRead())
                {
                    wb = ulxConverter.Imager.GetImageSource(stream, Configuration.rw, Configuration.rh);
                }
                Thread.Sleep(1);
                text = "";
                //compress resample
                using (Stream Source = ulxUtil.JpgEncoder.Encode(wb, 20))
                {
                    StreamReader reader = new StreamReader(Source);
                    text = reader.ReadToEnd();
                }
                Thread.Sleep(1);
                //uploud resample
                this.transc.Text = "Uploading Resample: " + file.Name;
                Uploader ru = new Uploader("/cgi-bin/SIDES/ulx.cgi", "user", "pass", Configuration.dest, file.Name, 0, text);

                Thread myThreadT = new Thread(new ThreadStart(ru.doit));
                myThreadT.Start();
                this.mProgressBar.Value = i++;
                //end of loop
            }

            //ok, we are done. hide progress and show hidden controls
        this.mProgressBar.Visibility = Visibility.Collapsed;
            this.transc.Visibility = Visibility.Collapsed;
            this.Browse.IsEnabled = true;
            this.thw.Visibility = Visibility.Visible;
            this.thh.Visibility = Visibility.Visible;
            this.rw.Visibility = Visibility.Visible;
            this.rh.Visibility = Visibility.Visible;
            this.c1.Visibility = Visibility.Visible;
            this.c2.Visibility = Visibility.Visible;
            this.c3.Visibility = Visibility.Visible;
            this.c4.Visibility = Visibility.Visible;
            this.Dest.Visibility = Visibility.Visible;
    }
  }

public static class Configuration
{
    public static int thw;
    public static int thh;
    public static int rw;
    public static int rh;
    public static string src;
    public static string dest;
}



public class Uploader
{
    public string url;
    public string user;
    public string pass;
    public string path;
    public string source;       
    public int MODE;
    public string fn;       
    public string imgdata;
    private bool is_mac_unix = false;

    public Uploader(string url,string user,string pass,string path,string fn,int MODE,string imgdata)
    {
        this.url = url;
        this.user = user;
        this.pass = pass;
        this.path = path;
        this.fn = fn;
        this.MODE = MODE;
        this.imgdata = imgdata;

        string t = ""+Environment.OSVersion;
        if(t.IndexOf("x") != -1)
        {
            this.is_mac_unix = true;
        }

    }

    private ManualResetEvent mre = new ManualResetEvent(false);

    public void doit()
    {
        //string BODY = "datastring";
        WebClient sender = new WebClient();
        sender.OpenReadCompleted += new OpenReadCompletedEventHandler(this.ReadComplete);
        sender.OpenReadAsync(new Uri(this.url + "?blob=" + this.imgdata,UriKind.Absolute));
       mre.WaitOne();
    }
    public bool T = false;


    public void ReadComplete(object sender, OpenReadCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            this.T = true;
        }
        mre.Set();
    }
+1  A: 

As pointed out in your other question you really don't want to be using the ManualResetEvent stuff. I'll update this answer with a refactoring of your code when I get a chance. However the key item to a solution is the BackgroundWorker class. This will help you get all this work off of the main UI thread.

AnthonyWJones