Aggeluska Δημοσ. 5 Δεκεμβρίου 2013 Δημοσ. 5 Δεκεμβρίου 2013 εχω την εξης For loop για να μου κανει πριντ το 3Δ Ματριξ . ολα καλα μου την κανει πριντ. μετα θελω να βαλω την συναρτηση Sleep για να κανει 1 δευτ. καθυστεριση καθε φορα . οπτε το εγραψα ετσι , for(i=0;i<PLANES;i++) { for(j=0;j<ROWS;j++) { for(k=0;k<COLUMNS;k++) { printf("%0.0lf ", matrix_3D[j][k]); } printf("\n"); } printf("\n"); Sleep(1000); } η καθυστεριση γινετε μια χαρα , τα αποτελεσματα βγαινουν ομορφα αλλα αντι να σταματησει το προγραμμα εκει ,μου προσθετει και αλλα αποτελεσματα απο κατω σαν μηδενικα .... ξερει κανεις γτ το κανει αυτο ? εχω την εξης For loop για να μου κανει πριντ το 3Δ Ματριξ . ολα καλα μου την κανει πριντ. μετα θελω να βαλω την συναρτηση Sleep για να κανει 1 δευτ. καθυστεριση καθε φορα . οπτε το εγραψα ετσι , for(i=0;i<PLANES;i++) { for(j=0;j<ROWS;j++) { for(k=0;k<COLUMNS;k++) { printf("%0.0lf ", matrix_3D[j][k]); } printf("\n"); } printf("\n"); Sleep(1000); } η καθυστεριση γινετε μια χαρα , τα αποτελεσματα βγαινουν ομορφα αλλα αντι να σταματησει το προγραμμα εκει ,μου προσθετει και αλλα αποτελεσματα απο κατω σαν μηδενικα .... ξερει κανεις γτ το κανει αυτο ? ακυρο, το βρηκα για καποιο λογο εφταιγε το #include <window.h>
pandootek Δημοσ. 7 Δεκεμβρίου 2013 Δημοσ. 7 Δεκεμβρίου 2013 Σου προτείνω να κάνεις κάτι σαν κι αυτό για να διαλέγεις ακριβώς το χρόνο και να μη στηρίζεσαι στο πόσα loops μπορεί να κάνει το δικό σου PC. Άσε που αυτό που κάνεις έπηρεάζεται από 10000 παραμέτρους που έχουν να κάνουν με το hardware το O/S και δε συμμαζέυεται! Κάνε καλύτερα αυτό για να έχεις πάντα τα ίδια αποτελέσματα ανεξαρτήτως μηχανήματος: /* Geeks Sleep Copyright (C) 2008 George Delaportas (qtgeo) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. E-Mail: [email protected] */ //Libraries #include <time.h> //Geeks Sleep (Function) void GSleep(int Sec) { //Variables time_t Go; //Time Variable time(&Go); Sec += Go; while (Go < Sec) { //Get Current Time time(&Go); } } /* ------------------------------------------------------------------------ */ 2
pandootek Δημοσ. 7 Δεκεμβρίου 2013 Δημοσ. 7 Δεκεμβρίου 2013 LOL! Ναι φοβερός κώδικας.... πανέξυπνος... Αχαχαχχα! Μια φορά πάντως του λύνει τα προβλήματα!
παπι Δημοσ. 8 Δεκεμβρίου 2013 Δημοσ. 8 Δεκεμβρίου 2013 Δεν αντεξα 3 γραμμες κωδικας και εχεις κανει 2 λαθη... Λαθος ενα. Δεν ειναι geeks sleep ( ) ειναι busy wait Λαθος δυο. Στα του κωδικα τωρα. Εχεις 2 μεταβλητες ολες και ολες, 2 μεταβλητες για την ιδια δουλεια, αλλα για καποιο λογο η μια εχει διαφορετικο τυπο απο την αλλη. Τωρα για το "του λυνει τα προβληματα" Πρωτο run Μονο 95% εξω. Οκ, εβαλα και εγω το second, δεν ειμαι σωστος.. anyway. Εγραψα ως πρωτο λαθος το "δεν ειναι geeks sleep αλλα busy wait" επειδη το sleep με το busy wait, απεχουν αιωνες φωτος. Τι κανει το Sleep; Πολυ απλα, δεν στελνει opcode του προγραμματος σου στη cpu. Τι κανει το busy wait; Αυτη ειναι η μεταφραση με full speed opt. //Libraries #include <time.h> //Geeks Sleep (Function) _declspec(noinline) void GSleep(int Sec) { 011A1270 push ebp 011A1271 mov ebp,esp 011A1273 sub esp,8 011A1276 push ebx 011A1277 push esi 011A1278 push edi //Variables time_t Go; //Time Variable time(&Go); 011A1279 mov edi,dword ptr ds:[11A306Ch] 011A127F lea eax,[Go] 011A1282 push eax 011A1283 call edi Sec += Go; 011A1285 mov ecx,dword ptr [Go] //Variables time_t Go; //Time Variable time(&Go); 011A1288 add esp,4 Sec += Go; 011A128B lea eax,[ecx+1] while (Go < Sec) 011A128E cdq 011A128F mov ebx,edx 011A1291 mov esi,eax 011A1293 cmp dword ptr [ebp-4],ebx 011A1296 jg GSleep+45h (011A12B5h) 011A1298 jl GSleep+30h (011A12A0h) 011A129A cmp ecx,esi 011A129C jae GSleep+45h (011A12B5h) 011A129E mov edi,edi { //Get Current Time time(&Go); 011A12A0 lea eax,[Go] 011A12A3 push eax 011A12A4 call edi 011A12A6 add esp,4 while (Go < Sec) 011A12A9 cmp dword ptr [ebp-4],ebx 011A12AC jl GSleep+30h (011A12A0h) 011A12AE jg GSleep+45h (011A12B5h) 011A12B0 cmp dword ptr [Go],esi 011A12B3 jb GSleep+30h (011A12A0h) } } 011A12B5 pop edi 011A12B6 pop esi 011A12B7 pop ebx 011A12B8 mov esp,ebp 011A12BA pop ebp 011A12BB ret Εαν προσεξεις καλα. Το loop ειναι αναμεσα στο 12α0 - 12β3. Εκει μεσα εχεις μονο registers, δεν κανεις ουτε ενα hit στη ram. Τι σημαινει αυτο; Με καθε κυκλο του cpu, η control unit δινει enable σε δυο registers και την alu. Θα μου πεις, σιγα τα ωα. Εμ, δεν ειναι σιγα τα ωα. Ο register στην cpu (αν δεν κανω λαθος) ειναι flip-flop, δηλαδη εχεις 4 mosfets για καθε bit, το cmp γινεται με τον adder (αν και παλι δεν κανω λαθος), που ο καθε adder εχει 10 mosfet per bit. αρα εχουμε 10 * 32 του adder 320 Mosfet + 4 * 32 * 2 των registers 256 συνολο 576 mosfet εν δραση (χωρις ram hit, πας σε full load του cpu. Αν εκανε ram hit, τοτε θα περιμενε σχετικα παρα πολυ ωρα). Βεβαια οι mosfet ειναι tranzistors δηλαδη γειωνουν, δηαλδη απλα, "θελω ρευμα για να ψησω". Φυσικα τα νουμερα απο πανω ειναι για αρκετα απλο cpu, οι συγχρονοι εχουν εκ μοσφετ. Αλλα και παλι το αποτελεσμα ειναι μαθηματικα σιγουρο. Το παραπανω θελει ρευμα και δινει θερμοκρασια. Οριστε. Πριν την εκτελεση Μετα απο 50 sec ΥΓ: Σε τρολαρω, αλλα το κανω με στιλ ΥΓ1: Αληθεια λεω, ειναι πολυ μπροστα. Οτι πρεπει για τοστιερα. 2
ChRis6 Δημοσ. 8 Δεκεμβρίου 2013 Δημοσ. 8 Δεκεμβρίου 2013 @παπι: Sublime Text customized? Μαλλον visual studio edit: Ορκιζομαι !!!! 1:39 @παπι δεν ειχες απαντησει !!!!
pandootek Δημοσ. 8 Δεκεμβρίου 2013 Δημοσ. 8 Δεκεμβρίου 2013 (επεξεργασμένο) Δεν αντεξα 3 γραμμες κωδικας και εχεις κανει 2 λαθη... Λαθος ενα. Δεν ειναι geeks sleep ( ) ειναι busy wait Λαθος δυο. Στα του κωδικα τωρα. Εχεις 2 μεταβλητες ολες και ολες, 2 μεταβλητες για την ιδια δουλεια, αλλα για καποιο λογο η μια εχει διαφορετικο τυπο απο την αλλη. Τωρα για το "του λυνει τα προβληματα" Πρωτο run gsleep1.PNG Μονο 95% εξω. Οκ, εβαλα και εγω το second, δεν ειμαι σωστος.. anyway. Εγραψα ως πρωτο λαθος το "δεν ειναι geeks sleep αλλα busy wait" επειδη το sleep με το busy wait, απεχουν αιωνες φωτος. Τι κανει το Sleep; Πολυ απλα, δεν στελνει opcode του προγραμματος σου στη cpu. Τι κανει το busy wait; Αυτη ειναι η μεταφραση με full speed opt. //Libraries #include <time.h> //Geeks Sleep (Function) _declspec(noinline) void GSleep(int Sec) { 011A1270 push ebp 011A1271 mov ebp,esp 011A1273 sub esp,8 011A1276 push ebx 011A1277 push esi 011A1278 push edi //Variables time_t Go; //Time Variable time(&Go); 011A1279 mov edi,dword ptr ds:[11A306Ch] 011A127F lea eax,[Go] 011A1282 push eax 011A1283 call edi Sec += Go; 011A1285 mov ecx,dword ptr [Go] //Variables time_t Go; //Time Variable time(&Go); 011A1288 add esp,4 Sec += Go; 011A128B lea eax,[ecx+1] while (Go < Sec) 011A128E cdq 011A128F mov ebx,edx 011A1291 mov esi,eax 011A1293 cmp dword ptr [ebp-4],ebx 011A1296 jg GSleep+45h (011A12B5h) 011A1298 jl GSleep+30h (011A12A0h) 011A129A cmp ecx,esi 011A129C jae GSleep+45h (011A12B5h) 011A129E mov edi,edi { //Get Current Time time(&Go); 011A12A0 lea eax,[Go] 011A12A3 push eax 011A12A4 call edi 011A12A6 add esp,4 while (Go < Sec) 011A12A9 cmp dword ptr [ebp-4],ebx 011A12AC jl GSleep+30h (011A12A0h) 011A12AE jg GSleep+45h (011A12B5h) 011A12B0 cmp dword ptr [Go],esi 011A12B3 jb GSleep+30h (011A12A0h) } } 011A12B5 pop edi 011A12B6 pop esi 011A12B7 pop ebx 011A12B8 mov esp,ebp 011A12BA pop ebp 011A12BB ret Εαν προσεξεις καλα. Το loop ειναι αναμεσα στο 12α0 - 12β3. Εκει μεσα εχεις μονο registers, δεν κανεις ουτε ενα hit στη ram. Τι σημαινει αυτο; Με καθε κυκλο του cpu, η control unit δινει enable σε δυο registers και την alu. Θα μου πεις, σιγα τα ωα. Εμ, δεν ειναι σιγα τα ωα. Ο register στην cpu (αν δεν κανω λαθος) ειναι flip-flop, δηλαδη εχεις 4 mosfets για καθε bit, το cmp γινεται με τον adder (αν και παλι δεν κανω λαθος), που ο καθε adder εχει 10 mosfet per bit. αρα εχουμε 10 * 32 του adder 320 Mosfet + 4 * 32 * 2 των registers 256 συνολο 576 mosfet εν δραση (χωρις ram hit, πας σε full load του cpu. Αν εκανε ram hit, τοτε θα περιμενε σχετικα παρα πολυ ωρα). Βεβαια οι mosfet ειναι tranzistors δηλαδη γειωνουν, δηαλδη απλα, "θελω ρευμα για να ψησω". Φυσικα τα νουμερα απο πανω ειναι για αρκετα απλο cpu, οι συγχρονοι εχουν εκ μοσφετ. Αλλα και παλι το αποτελεσμα ειναι μαθηματικα σιγουρο. Το παραπανω θελει ρευμα και δινει θερμοκρασια. Οριστε. Πριν την εκτελεση cpu0.PNG Μετα απο 50 sec cpu1.PNG ΥΓ: Σε τρολαρω, αλλα το κανω με στιλ ΥΓ1: Αληθεια λεω, ειναι πολυ μπροστα. Οτι πρεπει για τοστιερα. Ναι ρε boy σωστά τα λες αλλά και πάλι ως προς τί όλη αυτή η ανάλυση... Ο άνθρωπος ήθελε μια τυπική λύση που δουλεύει καλύτερα από το να έχει loops.... Του έδωσα ένα ρολόι εκεί να κάνει τη δουλειά του και τέλος. Σε πείραξε προφανώς το "Geeks". Ξεκόλα, ένα όνομα είπα να δώσω. Δεν μπήκα καν στη διαδικασία να βελτιστοποιήσω και πόσο μάλλον να κάτσω να δώ τον Assembler. ΗΜΑΡΤΩΝ, τι σχέση έχουν όλα αυτά με το θέμα του παιδιού από πάνω. Έχασα κάτι? Επιπλέον, έδωσα την παραπάνω για να είναι portable η λύση του και όχι σαν την υπέρτατη σωστή λύση. Να εξηγούμαστε... Η Sleep, δεν είναι και standard στη λειτουργία της σε όλα τα O/S και τέλος δεν ανήκει στο ίδιο πακέτο headers σε Windows, Linux, Mac κτλ... Άρα πρακτικά από αυτό που είχε στο μυαλό του πήρε ένα πολύ καλύτερο approximation από το να πεδεύεται με τα include και τις παραξενειές. Τελικά, δεν έδωσες στον άνθρωπο μια λύση για την... τοστιέρα. Δώστην και άσε τις επεξηγήσεις και το τρολάρισμα! Προφανώς τώρα εσύ... Υ.Γ: Ενδιαφέρεσαι για δουλειά? Στείλε μου PM ;-) Επεξ/σία 8 Δεκεμβρίου 2013 από pandootek
παπι Δημοσ. 8 Δεκεμβρίου 2013 Δημοσ. 8 Δεκεμβρίου 2013 Υ.Γ: Ενδιαφέρεσαι για δουλειά? Στείλε μου PM ;-) Προγραμματιστης τοσιτιερων; 1
migf1 Δημοσ. 8 Δεκεμβρίου 2013 Δημοσ. 8 Δεκεμβρίου 2013 @παπι: Θεωρώ πως είσαι υπερβολικός. Δεν νομίζω πως ο TS ενδιαφέρεται στη φάση που είναι για το αν η καθυστέρησή του θα είναι spinned ή όχι. Οπότε νομίζω πως η απάντηση του pandootek στέκει μια χαρά για τα πλαίσια του παρόντος νήματος. Αν και για ακόμα πιο hassle-free θα μπορούσε να χρησιμοποιήσει και τη στάνταρ difftime() και να βάζει τη συνάρτηση να επιστρέφει και το delay για ενδεχόμενο error checking από τον caller. Κάτι σαν το παρακάτω... ... #include <time.h> ... double sleep_in_secs( double secs ) { double ret = -1.0; if ( secs > 0.0 ) { time_t tstart = time(NULL); do { ret = difftime(time(NULL),tstart); } while ( ret < secs ); } return ret; } ... printf( "Slept for: %g secs\n", sleep_in_secs(-0.5) ); ... 1
παπι Δημοσ. 8 Δεκεμβρίου 2013 Δημοσ. 8 Δεκεμβρίου 2013 Σιγουρα ειμαι υπερβολικος. Αλλα και παλι διαφωνω στο busy wait σε multitsking os. Ας ειναι και ασκηση.
migf1 Δημοσ. 8 Δεκεμβρίου 2013 Δημοσ. 8 Δεκεμβρίου 2013 Σιγουρα ειμαι υπερβολικος. Αλλα και παλι διαφωνω στο busy wait σε multitsking os. Ας ειναι και ασκηση. Κοίτα, με αυτή τη λογική θα μπορούσε κάποιος να το τραβήξει κι άλλο και να σου πει για παράδειγμα πως διαφωνεί να γράφεις ευρείας κατανάλωσης συναρτήσεις μονάχα για ένα λειτουργικό, οπότε φτιάξε την να είναι cross-platform τουλάχιστον για Win και Linux/Unix... και κάποιος άλλος να το τραβήξει ακόμα περισσότερο και να σου πει για παράδειγμα: "Τι secs και λαλακίες! Εν έτη 2013 τα secs είναι αιώνες, οπότε φτιάξε την με nanosecs" και πάει λέγοντας... και στο τέλος να θες να φτιάξεις απλώς μια συνάρτηση delay για μια άσκηση αρχαρίου σε ρυθμό κονσόλας και να καταλήξεις να γράψεις κάτι σαν κι αυτό: http://fossies.org/dox/coreutils-8.21/nanosleep_8c_source.html
παπι Δημοσ. 8 Δεκεμβρίου 2013 Δημοσ. 8 Δεκεμβρίου 2013 Ποιος ειναι αυτος ο καποιος; Και στο κατω κατω, ποιο ειναι αυτο το λειτουργικο το οποιο δεν μπορει να βαλει σε αδρανεια μια task και λεγεται multitasking os; Ασε που αν δε κανω λαθος, sleep εχει και το posix, αρα αυτοματος το cross-platform παει περιπατο.
migf1 Δημοσ. 8 Δεκεμβρίου 2013 Δημοσ. 8 Δεκεμβρίου 2013 Η Sleep() (Win) με τη sleep() (Posix) δεν είναι συμβατές (έχεις επιχειρήσει να φτιάξεις cross-platform sleeper/timer ακριβείας σε C; δεν είναι και τόσο απλό). Τέσπα, το κύριο θέμα όμως δεν είναι αυτό, είναι πως από ότι καταλαβαίνω κατά πάσα πιθανότητα ο TS δεν έχει διδαχθεί καν τι σημαίνει thread, process, κλπ. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα