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

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

Δημοσ.

εχω την εξης 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>

Δημοσ.

Σου προτείνω να κάνεις κάτι σαν κι αυτό για να διαλέγεις ακριβώς το χρόνο και να μη στηρίζεσαι στο πόσα 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);
    
    }

}

/* ------------------------------------------------------------------------ */

  • Like 2
Δημοσ.

Δεν αντεξα  :-D

3 γραμμες κωδικας και εχεις κανει 2 λαθη... 

Λαθος ενα. Δεν ειναι geeks sleep ( whatever.gif ) ειναι busy wait

Λαθος δυο. Στα του κωδικα τωρα. Εχεις 2 μεταβλητες ολες και ολες, 2 μεταβλητες για την ιδια δουλεια, αλλα για καποιο λογο η μια εχει διαφορετικο τυπο απο την αλλη. 

 

 

Τωρα για το "του λυνει τα προβληματα"

Πρωτο run

post-216584-0-58760000-1386454163_thumb.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, οι συγχρονοι εχουν εκ μοσφετ.

 

Αλλα και παλι το αποτελεσμα ειναι μαθηματικα σιγουρο. Το παραπανω θελει  ρευμα και δινει θερμοκρασια. 

 

Οριστε.

Πριν την εκτελεση

 

 

post-216584-0-48522500-1386458692_thumb.png

 

Μετα απο 50 sec

post-216584-0-81932400-1386458715_thumb.png

 

 

ΥΓ: Σε τρολαρω, αλλα το κανω με στιλ

ΥΓ1: Αληθεια λεω, ειναι πολυ μπροστα. Οτι πρεπει για τοστιερα.

  • Like 2
Δημοσ. (επεξεργασμένο)

Δεν αντεξα  :-D

3 γραμμες κωδικας και εχεις κανει 2 λαθη... 

Λαθος ενα. Δεν ειναι geeks sleep ( whatever.gif ) ειναι busy wait

Λαθος δυο. Στα του κωδικα τωρα. Εχεις 2 μεταβλητες ολες και ολες, 2 μεταβλητες για την ιδια δουλεια, αλλα για καποιο λογο η μια εχει διαφορετικο τυπο απο την αλλη. 

 

 

Τωρα για το "του λυνει τα προβληματα"

Πρωτο run

attachicon.gifgsleep1.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, οι συγχρονοι εχουν εκ μοσφετ.

 

Αλλα και παλι το αποτελεσμα ειναι μαθηματικα σιγουρο. Το παραπανω θελει  ρευμα και δινει θερμοκρασια. 

 

Οριστε.

Πριν την εκτελεση

 

 

attachicon.gifcpu0.PNG

 

Μετα απο 50 sec

attachicon.gifcpu1.PNG

 

 

ΥΓ: Σε τρολαρω, αλλα το κανω με στιλ

ΥΓ1: Αληθεια λεω, ειναι πολυ μπροστα. Οτι πρεπει για τοστιερα.

 

Ναι ρε boy σωστά τα λες αλλά και πάλι ως προς τί όλη αυτή η ανάλυση... Ο άνθρωπος ήθελε μια τυπική λύση που δουλεύει καλύτερα από το να έχει loops.... Του έδωσα ένα ρολόι εκεί να κάνει τη δουλειά του και τέλος.

 

Σε πείραξε προφανώς το "Geeks". Ξεκόλα, ένα όνομα είπα να δώσω. Δεν μπήκα καν στη διαδικασία να βελτιστοποιήσω και πόσο μάλλον να κάτσω να δώ τον Assembler.

 

ΗΜΑΡΤΩΝ, τι σχέση έχουν όλα αυτά με το θέμα του παιδιού από πάνω. Έχασα κάτι?

 

Επιπλέον, έδωσα την παραπάνω για να είναι portable η λύση του και όχι σαν την υπέρτατη σωστή λύση. Να εξηγούμαστε...

Η Sleep, δεν είναι και standard στη λειτουργία της σε όλα τα O/S και τέλος δεν ανήκει στο ίδιο πακέτο headers σε Windows, Linux, Mac κτλ... Άρα πρακτικά από αυτό που είχε στο μυαλό του πήρε ένα πολύ καλύτερο approximation από το να πεδεύεται με τα include και τις παραξενειές.

 

Τελικά, δεν έδωσες στον άνθρωπο μια λύση για την... τοστιέρα. Δώστην και άσε τις επεξηγήσεις και το τρολάρισμα! Προφανώς τώρα εσύ... whatever.gif

 

Υ.Γ: Ενδιαφέρεσαι για δουλειά? Στείλε μου PM ;-)

Επεξ/σία από pandootek
Δημοσ.

@παπι: Θεωρώ πως είσαι υπερβολικός. Δεν νομίζω πως ο 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) );
...
  • Like 1
Δημοσ.

Σιγουρα ειμαι υπερβολικος. Αλλα και παλι διαφωνω στο 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 :P

Δημοσ.

Ποιος ειναι αυτος ο καποιος; Και στο κατω κατω, ποιο ειναι αυτο το λειτουργικο το οποιο δεν μπορει να βαλει σε αδρανεια μια task και λεγεται multitasking os; Ασε που αν δε κανω λαθος, sleep εχει και το posix, αρα αυτοματος το cross-platform παει περιπατο.

Δημοσ.

Η Sleep() (Win) με τη sleep() (Posix) δεν είναι συμβατές (έχεις επιχειρήσει να φτιάξεις cross-platform sleeper/timer ακριβείας σε C; δεν είναι και τόσο απλό).

 

Τέσπα, το κύριο θέμα όμως δεν είναι αυτό, είναι πως από ότι καταλαβαίνω κατά πάσα πιθανότητα ο TS δεν έχει διδαχθεί καν τι σημαίνει thread, process, κλπ.

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...