Προς το περιεχόμενο

C# Pda App πρόβλημα ταχύτητας στο κάλεσμα πολών αντικειμένων


chrism4111

Προτεινόμενες αναρτήσεις

Δημοσ.

Για σας και πάλι ..

Ας μπω γρήγορα στο θέμα ..

 

Εργάζομαι me to VisualStudio 2008 και με το Compact FrameWork..

 

Θέλω να καλέσω ένα object το οποίο είναι ήδη στο design mode στη φόρμα με τον εξης τροπο.

 

έχω για παράδειγμα το button1 και button2 θέλω με

>for(i=1;i<=2;i++)
{
   button+i.Text = "Text";
}  

 

 

πως κάτι τέτοιο μπορεί να γίνει εφικτό στην C#

Προσοχή αυτο που ζητάω πρέπει να γίνει σε combact framework αρα καποια λύση να ειναι εφορμόσιμη σε αυτο ..

Ευχαριστω εκ των προτέρων

 

**Πριν κλείσω έχω καταφέρει να πετύχω αυτό με έναν άλλον τρόπο δείτε τον:

 

 

>
Control[] ctrl = { button1,button2 };
for(i=0;i<2;i++) 
{
   ctrl[i].Text = "Text";   
} 

 

//Φανταστείτε να έχω όμως 30+ buttons (που έχω 33 buttons) μέσα στην φόρμα πόσο αργά μου δινει το αποτέλεσμα. Συνολικά για 33 buttons κάνει 12.5 δευτερόλεπτα για να τελειώσει της επαναλήψεις(Το i του παρακάτω κώδικα το χρησιμόποιώ για να κάνω ερώτημα σε έναν πίνακα βάσης δεδομένων (SqlCeCompact) που μου εξάγει κάποιον αριθμο και αυτος μπαίνει μετα σαν index του πίνακα array των buttons).

Δημοσ.

Για σας και πάλι ..

Ας μπω γρήγορα στο θέμα ..

 

Εργάζομαι me to VisualStudio 2008 και με το Compact FrameWork..

 

Θέλω να καλέσω ένα object το οποίο είναι ήδη στο design mode στη φόρμα με τον εξης τροπο.

 

έχω για παράδειγμα το button1 και button2 θέλω με

>for(i=1;i<=2;i++)
{
   button+i.Text = "Text";
}  

 

 

πως κάτι τέτοιο μπορεί να γίνει εφικτό στην C#

Προσοχή αυτο που ζητάω πρέπει να γίνει σε combact framework αρα καποια λύση να ειναι εφορμόσιμη σε αυτο ..

Ευχαριστω εκ των προτέρων

 

**Πριν κλείσω έχω καταφέρει να πετύχω αυτό με έναν άλλον τρόπο δείτε τον:

 

 

>
Control[] ctrl = { button1,button2 };
for(i=0;i<2;i++) 
{
   ctrl[i].Text = "Text";   
} 

 

//Φανταστείτε να έχω όμως 30+ buttons (που έχω 33 buttons) μέσα στην φόρμα πόσο αργά μου δινει το αποτέλεσμα. Συνολικά για 33 buttons κάνει 12.5 δευτερόλεπτα για να τελειώσει της επαναλήψεις(Το i του παρακάτω κώδικα το χρησιμόποιώ για να κάνω ερώτημα σε έναν πίνακα βάσης δεδομένων (SqlCeCompact) που μου εξάγει κάποιον αριθμο και αυτος μπαίνει μετα σαν index του πίνακα array των buttons).

 

το προβλημα σου ειναι εκει.

να σου υπενθυμισω πως η sqlce διαβαζει σειριακα και αμα εχεις βαλει και καποιον ελεγχο μεσα του πεδιου, τοτε ισως και να ειναι λογικος ο χρονος.

 

παντως σε παραδειγμα που εστησα με 30 κουμπια, δεν ξεπερασε ο χρονος το 1 sec.

Δημοσ.

>
private void Tables_Load(object sender, EventArgs e)
       {
           Control[] ctrol = { button1, button1, button2, button3, button4, button5, button6, button7, button8, button1, button1, button11, button12, button13, button14, button15, button16, button17, button18, button19, button20, button1, button1, button1, button1, button1, button1, button1, button1, button1, button1, button31, button32, button33, button34, button35 };

           this.activeTables2TableAdapter.Fill(this.appDatabase1DataSet.activeTables2);
           int i = this.activeTables2TableAdapter.GetData().Rows.Count;
           if (i > 0)
           {
               for (int y = 0; y < i; y++)
               {
                   string str = this.activeTables2TableAdapter.GetData().Rows[y]["TableNo"].ToString();
                   int numberArray = Convert.ToInt32(str);
                   ctrol[numberArray].BackColor = Color.Lime;
               }
           }
       }

 

Για την ακρίβεια ο κώδικας είναι ο παρακάτω... Παίζω με Dataset για να τραβήξω δεδομένα απο την βάση μου..

Μήπως ο λόγος που αργή έχει να κανει με το οτι τρέχω το πρόγραμμα σε Windows Mobile 6.1?

Αν το όλο αυτο στηνόταν σε Windows CE θα ήταν πιο γρήγορο?

Δημοσ.

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

ctrol[numberArray].BackColor = Color.Lime;

 

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

 

οχι, δεν θα ειναι καλυτερα σε Windows CE.

 

ποιο framework χρησιμοποιεις? φανταζομαι το 3,5, ετσι?

Δημοσ.

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

ctrol[numberArray].BackColor = Color.Lime;

 

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

 

οχι, δεν θα ειναι καλυτερα σε Windows CE.

 

ποιο framework χρησιμοποιεις? φανταζομαι το 3,5, ετσι?

 

Φυσικά και σε 3.5.

Θα δοκιμάσω να βγάλω το χρώμα να δω την διαφορά..

Δημοσ.

Το έκανα χωρίς χρώμα τελικα και πάλι τα ίδια. Επεσε βέβαια 2 δευτερόλεπτα ο χρόνος αλλα και πάλι είναι αργό.

Δημοσ.

string str = this.activeTables2TableAdapter.GetData().Rows[y]["TableNo"].ToString();

 

Κράτα το αποτέλεσμα της this.activeTables2TableAdapter.GetData() σε μια μεταβλητή αντίστοιχου τύπου, ώστε να μην καλείς την GetData() διαρκώς.

Δημοσ.

string str = this.activeTables2TableAdapter.GetData().Rows[y]["TableNo"].ToString();

 

Κράτα το αποτέλεσμα της this.activeTables2TableAdapter.GetData() σε μια μεταβλητή αντίστοιχου τύπου, ώστε να μην καλείς την GetData() διαρκώς.

 

η getData δεν γίνετε να μην καλείτε συνεχώς απο αυτήν παίρνω τα δεδομένα κάθε σειράς του πεδίου [TableNo] και το βάζω ουσιαστικά σαν δείκτη για να καλέσω το κατάλληλο object από τον πίνακα array που έχω δηλωμένο παραπάνω.

 

Έχω σκεφτεί βέβαια και μια άλλη εκδοχή να φτιάξω μια κλάση σε εξωτερικό αρχείο η οποία θα επιστρέφει έναν πίνακα array και θα παίρνω από εκεί τα δεδομένα χωρίς να χρειάζεστε να τα τραβάω από την βάση δεδομένων . Μόνο μειονέκτημα όμως αυτής της εκδοχής είναι ότι μόλις η εφαρμογή κλείσει τότε αυτές οι μεταβλητές θα χάνονται. Αλλά μπορώ κατά την διάρκεια του ανοίγματος του προγράμματος στο splash screen να φορτώνω στην κλάση ξανά τις μεταβλητές που θέλω.

Το πρόβλημα μου όμως είναι ότι δεν έχω χρησιμοποιήσει ξανά κλάση η οποία θα επιστρέφει πίνακα array. Μπερδεύομαι με τους getters και setters.

Μπορεί κάποιος να μου δώσει ένα τέτοιο παράδειγμα?

Δημοσ.

>
DataTable t = this.activeTables2TableAdapter.GetData();

for (int y = 0; y < i; y++)
{
     string str = t.Rows[y]["TableNo"].ToString();
....
}

 

Κάλεσε την GetData όπως σου είπα μια φορά.

Δημοσ.

>
DataTable t = this.activeTables2TableAdapter.GetData();

for (int y = 0; y < i; y++)
{
     string str = t.Rows[y]["TableNo"].ToString();
....
}

 

Κάλεσε την GetData όπως σου είπα μια φορά.

 

Sorry δεν το κατάλαβα ότι το εννοούσες με αυτόν τον τρόπο. Για να δω θα υπάρξει διαφορά?? Τ ο κανω καιαπαντώ

 

Sorry δεν το κατάλαβα ότι το εννοούσες με αυτόν τον τρόπο. Για να δω θα υπάρξει διαφορά?? Τ ο κανω καιαπαντώ

 

Είσαι θεός τεράστια διαφορά (αφού φορτώνει στην μνήμη μια φόρα το DataTable). από τα 10 δευτερόλεπτα με έριξες στο 1 δευτερόλεπτο ....

 

Ευχαριστώ πάρα μα πάρα πολύ αφού δεν μου έλυσες μόνο αυτό αλλά και πολλά κομμάτια όλης της εφαρμογής..

Δημοσ.

Μιας και από ότι καταλαβαίνω είσαι λίγο αρχάριος, να έχεις γενικά στο νου όταν προγραμματίζεις το εξής :

Το ότι καλείς μια συνάρτηση και αυτό γίνεται σε μια γραμμή κώδικα, δεν σημαίνει ότι θα εκτελεστεί και αμέσως. Μπορεί να κάνει 1002 πράγματα η συνάρτηση όταν την καλείς.

Δημοσ.

Μιας και από ότι καταλαβαίνω είσαι λίγο αρχάριος, να έχεις γενικά στο νου όταν προγραμματίζεις το εξής :

Το ότι καλείς μια συνάρτηση και αυτό γίνεται σε μια γραμμή κώδικα, δεν σημαίνει ότι θα εκτελεστεί και αμέσως. Μπορεί να κάνει 1002 πράγματα η συνάρτηση όταν την καλείς.

 

Ναι είμαι αρχάριος οσον αφορα τα dataset(αφου τα χρησιμόποιω για πρώτη φορά και προγραμματίζω για πρώτη φορα εφαρμογή σε Compact Framework το οποίο είναι αρκετά περιορισμένo σε σχέση με το .ΝΕΤ Framework) o κωδικας που έχει σχηματιστεί πίσω απο το dataset(design.cs) είναι γύρω στις 6000 γραμμές και εκει έχω χάσει λιγο την μπάλα. Αυτην την στιγμή έχω σχεδον τελιωσει την εφαρμογή και προσπαθώ να πετύχω οσο μικρότερους χρόνους γίνετε στο κομάτι επικοινωνίας του προγραμματος με την βάση δεδομένων (δηλαδη InsertQuerys, DeleteQuerys , UpdateQuerys).

>
for (int y = 0; y < dataGrid1.VisibleRowCount; y++) 
         {
payCheckTableAdapter.InsertQuery(TableNo.GlobalValue, duration, (Convert.ToDouble(text))/(dataGrid1.VisibleRowCount), DateTime.Now, null, getTime(Convert.ToDateTime(dataGrid1[y,1])));
               }

H TableNo.GlobalValue είναι μια μετάβλητη η οποια ειναι global,

η duration είναι μεταβλητη που περνει ουσιαστηκα μια τιμη απο την getTime

H getTime ειναι μια δικη μου συνάρτηση που το μονο που κανει ειναι να επιστρέφει ένα αριθμό απο αφαιρεση δύο ημερομινιών

ολες δηλαδή η μεταβλητες δεν έχουν να κανουν με διάβασμα δεδομένων απο την βάση μου

 

Πως θα μπορέσω να μειωσω το χρόνο σε αυτην εδω την επαναληψη;

Δημοσ.

Δεν ξέρω αν γίνεται να μειώσεις το χρόνο εκτέλεσης εδώ. Η InsertQuery τι κάνει; Insert στη βάση; Connection δεν χρειάζεται; Θα ήταν ένα πιθανό bottleneck αν σε κάθε κλήση της InsertQuery ανοιγοκλείνεις ένα connection.

Δημοσ.

Δεν ξέρω αν γίνεται να μειώσεις το χρόνο εκτέλεσης εδώ. Η InsertQuery τι κάνει; Insert στη βάση; Connection δεν χρειάζεται; Θα ήταν ένα πιθανό bottleneck αν σε κάθε κλήση της InsertQuery ανοιγοκλείνεις ένα connection.

Εισαγωγή δεδομενων στην βάση.

connection γίνετε με το που καλω την insertQuery.

Ακριβως αυτο γίνετε ανοιγοκλείνει ενα connection με to dataset.

Δημοσ.

Ε θα πρέπει να το αλλάξεις ως εξής (στο περίπου) :

 

>

SqlConnection conn = new SqlConnection(connectionString);

conn.open();

for (int y = 0; y < dataGrid1.VisibleRowCount; y++) 
{
      payCheckTableAdapter.InsertQuery(param1, param2 ..., conn);
}

conn.close();

 

Είτε άλλαξε την InsertQuery ώστε να παίρνει παράμετρο το connection ή φτιάξε μια overload. To ζήτημα είναι να ανοίξεις ένα connection για τα διαδοχικά queries και όχι να ανοίγεις ένα για κάθε query.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...