Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

BackGroundWorker

Îåêßíçóå áðü ôï ìÝëïò yannis. Τελευταία δημοσίευση από το μέλος yannis στις 29-04-2009, 15:23. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-04-2009, 20:35 50199

    BackGroundWorker

    Παιδιά καλησπέρα , έχω φάει τα λυσακά μου με το Backgroundworker.

    Το χρησιμοποιω κανονικα σε φορμες για να τρεξω χρονοβορες διαδικασιες και ολα καλα.

    θέλω όμως να φτιαξω μια Loadingform. στις περιπτωσεις που ανοιγω αλλες φορμες και κανουν ώρα να φορτώσουν data

    αντι λοιπον να βαλω σε καθε φορμα backgroundworker εφτιαξα μια frmwait και δεν βγαζω ακρη απο που και πως θα καλω το backgroundworker.

    Προσπαθησα να φτιαξω μια κλαση που να περναω το ονομα της φορμας που θελαω να ανοιξω και εγραψα αυτο τον κωδικα αλλα δεν καταλαβαινω πλεον τιποτα (ειμαι σχετικα ερασιτεχνης στον προγραμματισμο)

    Μπορειτε να βοηθησετε να το κατανοησω

    Public Sub ShowWait(ByVal show As Boolean, ByVal frmtoOpen As Form)

    Try

    AddHandler bg.DoWork, AddressOf workerDowork

    AddHandler bg.RunWorkerCompleted, AddressOf workerCompleted

    Dim fw As New frmWait

    If show Then

    Application.DoEvents()

    fw.StartPosition = FormStartPosition.Manual

    Dim bnd As New System.Drawing.Rectangle

    bnd = My.Computer.Screen.Bounds

    fw.Left = Math.Round(bnd.Width / 2) - Math.Round(fw.Width / 2)

    fw.Top = Math.Round(bnd.Height / 2) + Math.Round(fw.Height / 2)

    fw.TopMost = True

    fw.Show()

    Else

    For Each fw1 As Form In My.Application.OpenForms

    If fw1.Name = "frmwait" Then

    fw1.Close()

    Exit For

    End If

    Next

    End If

    Catch ex As Exception

    MessageBox.Show(ex.Message)

    End Try

    End Sub

    Private Sub workerDowork(ByVal sender As Object, ByVal e As doworkeventargs)

    Dim fn As New Form

    fn = e.Argument

    fn.Show()

    End Sub

    Private Sub workerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)

    End Sub


    Yannis
  •  27-04-2009, 20:10 50282 σε απάντηση της 50199

    Απ: BackGroundWorker

    Δες το Parallel Programming εδώ - http://blogs.msdn.com/pfxteam/

    Και κατέβασε το CTP Για το .Net 3.5 http://www.microsoft.com/downloads/details.aspx?FamilyId=348F73FD-593D-4B3C-B055-694C50D2B0F3&displaylang=en

    Αν δεν θές το PFX δοκίμασε να το κάνεις με threads. Κάνε μια στατική μέθοδο που δημιουργεί ένα νέο thread και βάλε να άνοίγει την φόρμα.

    1
    2
    3
    4
    5
    6
    7
    8
     
    Imports System.Windows.Forms
    Imports System.Threading
    Module FormHandler
    	Sub OpenFrm(ByVal frm As Form)
    		Dim th As new Thread( Addressof frm.Show)
    		th.Start()
    	End Sub
    End Module

    Άν θες να έχει και μια φόρμα Loading, απλά την φτιάχνεις και βάζεις στο Load να καλεί την OpenFrm.


    Iraklis Karagkiozoglou
  •  29-04-2009, 14:32 50341 σε απάντηση της 50282

    Απ: BackGroundWorker

    Ευχαριστω για την απαντηση. Στον κωδικα που μου εστειλες θα πρεπει να δημιουργησω και ενα νεο threat το οποιο να ανοιγει μονο την loading.... form? Καταλαβα καλα?

     


    Yannis
  •  29-04-2009, 15:14 50347 σε απάντηση της 50341

    Απ: BackGroundWorker

    Έκανα αυτήν την LoadingForm μονο που την έκανα σε C# γιατί δεν το έχω με την VBnet

    πρέπει να κάνεις

    using System.Windows.Forms;

    using System.Threading;

    using System.ComponentModel;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    	class MyLoadingForm : Form
    	{
    		private Form FrmToLoad;
    		private Label lblLoading;
    		private string _loadingText;
    		private BackgroundWorker bw;
    		private void InitializeComponents()
    		{
    			// set the form properties
    			this.Text = "";
    			this.AutoSize = true;
    			this.FormBorderStyle = FormBorderStyle.FixedSingle;
    			
    			// add a label
    			lblLoading = new Label();
    			lblLoading.AutoSize = true;
    			lblLoading.Text = _loadingText;
    			
    			this.Controls.Add(lblLoading);
    			
    			bw = new BackgroundWorker();
    			
    			
    			bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    			bw.RunWorkerCompleted+= new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
    			this.Load += new EventHandler(MyLoadingForm_Load);
    		}
    
    		void MyLoadingForm_Load(object sender, EventArgs e)
    		{
    			bw.RunWorkerAsync();
    		}
    
    		void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    		{
    			this.Close();
    		}
    
    		void bw_DoWork(object sender, DoWorkEventArgs e)
    		{
    			Thread th = new Thread(ShowDataForm);
    			
    			th.Start();			
    		}
    		
    		void ShowDataForm()
    		{
    			FrmToLoad.ShowDialog();
    		}
    		
    		public MyLoadingForm( Form frm, string LoadingText)
    		{
    			FrmToLoad = frm;
    			_loadingText = LoadingText;
    			
    			InitializeComponents();	
    		}
    	}

    και μετά φτιάχνεις την φόρμα που θες και το περνας σαν παράμετρο στον constructor και του περνάς και το loading text.

    1
    2
    3
    4
     
    Form frm = new Form();
    frm.Text = "DATA";
    MyLoadingForm frml = new MyLoadingForm( frm, "LOADING");
    frml.Show();


    Iraklis Karagkiozoglou
  •  29-04-2009, 15:23 50349 σε απάντηση της 50347

    Απ: BackGroundWorker

    ευχαριστω ΠΑΡΑ πολύ

     


    Yannis
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems