Ο Μανώλης έχει δίκιο, κοίτα πρώτα όσα σου έγραψε αλλά και το MSDN. Υπάρχουν πολλά άρθρα για threading, αν και στην περίπτωση σου η χρήση των delegates φαίνεται θα μπορούσε να βοηθήσει αλλά θα πρέπει να έχεις υπόψη τα προβλήματα που υπάρχουν στη χρήση VB6 από Web Services. Το multithreading δεν είναι εύκολη υπόθεση και θέλει διάβασμα. Δεν μπορείς να πάρεις μία έτοιμη λύση και να περιμένεις να λυθεί το πρόβλημα σου έτσι απλά. Για παράδειγμα, θα πρέπει να δημιουργήσεις ένα ξεχωριστό VB6 αντικείμενο για κάθε thread, καθώς η VB6 δεν φτιάχτηκε για να επιτρέπει ταυτόχρονες κλήσεις στο ίδιο αντικείμενο.
Είσαι σίγουρος ότι τα πράγματα θα πάνε πιο γρήγορα? Γιατί καθυστερεί το function? Μήπως μπλοκάρει στη βάση? Κάνει περίεργους υπολογισμούς σε loop? Κάτι άλλο? (Πες μου τώρα ότι η εφαρμογή σου είναι και χρηματιστηριακή!). Αν η εφαρμογή μπλοκάρει στη βάση, τα περισσότερα threads θα χειροτερέψουν την κατάσταση καθώς θα προκαλέσουν χειρότερο μπλοκάρισμα. Αν η εφαρμογή χρησιμοποιεί πολύ CPU μπορείς να επιταχύνεις τη διαδικασία αν δημιουργήσεις ένα thread ανά επεξεργαστή. Δεν έχει κανένα απολύτως νόημα να χρησιμοποιείς 10 thread όταν έχεις μόνο 1 επεξεργαστή.
Μετά σκέψου και το άλλο. Ένα web service δεν καλείται από ένα και μόνο client. Το VB6 dll σου μπορεί να καλείται ήδη από 10 διαφορετικούς client. Όπως είναι τώρα τα πράγματα, για 10 clients το dll καλείται 10 φορές ταυτόχρονα. Αν φτιάξεις 10 threads, το dll θα εκτελείται 100 φορές ταυτόχρονα. Ακόμα και αν το dll δεν χρησιμοποιεί καθόλου τη βάση, είμαι σίγουρος ότι δεν έχεις 100 CPU στο μηχάνημα σου. Για τον ίδιο αριθμό CPU θα έχεις αυξήσει την καθυστέρηση λόγω thread switching χωρίς αντίστοιχη βελτίωση στην ταχύτητα.
Αν ο λόγος που καθυστερεί το function είναι κακός προγραμματισμός είτε σε επίπεδο VB6 ή στη βάση, θα καταφέρεις πολύ καλύτερα αποτελέσματα, πολύ ευκολότερα, διορθώνοντας τον προβληματικό κώδικα. Για παράδειγμα, μπορεί να έχεις ένα loop μέσα στο οποίο υπολογίζεται συνέχεια το ίδιο πράγμα. Αν βγάλεις αυτό το κομμάτι του υπολογισμού έξω από το loop θα πετύχεις σημαντική αύξηση ταχύτητας. Άλλος λόγος για σημαντική καθυστέρηση είναι η χρήση cursor στη βάση, ή η χρήση recordsets με client ή server side cursors. Θα πετύχεις πολύ μεγαλύτερη αύξηση στην ταχύτητα αν χρησιμοποιήσεις disconnected recordsets και stored procedures.
Πριν από καιρό χρειάστηκε να αντιμετωπίσω μία τέτοια κακογραμμένη εφαρμογή. Η εφαρμογή υπολόγιζε αποδόσεις χαρτοφυλακίων και ήθελε 4 ημέρες να επεξεργαστεί όλα τα δεδομένα. Ένας από τους λόγους ήταν η χρήση cursors και recordsets. Ο άλλος ήταν ότι ο υπολογισμός της τιμής κάθε τίτλου (π.χ. μετοχής, αμοιβαίου, ομολόγου) γίνονταν ανά πελάτη, τίτλο και ημερομηνία. Όμως, ο υπολογισμός ανά τίτλο έφερνε το ίδιο αποτέλεσμα για όλους τους πελάτες την ίδια ημερομηνία. Ουσιαστικά η τιμή του τίτλου υπολογιζόταν χωρίς λόγο μερικές χιλιάδες φορές.
Αλλάζοντας τον τρόπο υπολογισμού των τίτλων και αντικαθιστώντας το 80% του κώδικα που χρησιμοποιούσε recordsets ο χρόνος υπολογισμού έπεσε στις 2-4 ώρες.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos