Avatar billede george Nybegynder
11. april 2003 - 12:28 Der er 45 kommentarer og
1 løsning

Delay under DOS med C++

Kan man lave en delay/sleep der kan virke i dos med C++?

Det skal helst virke med en parameter som indeholder tiden for delayet.

Hvis man kan, hvordan gøres det. Lidt kode ville være godt ;-)
Avatar billede jpk Nybegynder
11. april 2003 - 12:30 #1
er det rigtig DOS eller er det Windows/Dos
Avatar billede george Nybegynder
11. april 2003 - 12:31 #2
Det er Windows/Dos.
Avatar billede jpk Nybegynder
11. april 2003 - 12:35 #3
I MS Visual C++ kunne det se sådan ud:

#include "stdafx.h"
#include <Windows.h>
#include <iostream.h>

int main(int argc, char* argv[])
{
    cout << "Before delay" << endl;
    Sleep(1000);
    cout << "After delay" << endl;

    return 0;
}
Avatar billede Slettet bruger
11. april 2003 - 12:35 #4
jeg ved ikke om det er muligt i C++ men i Java har man jo Thread.sleep() funktionen. Den tager milisekunder som parameter.. Kunne forestille mig der fandtes noget lignende
Avatar billede george Nybegynder
11. april 2003 - 12:39 #5
Er ikke en haj til C++ så derfor bliver jeg nødt til at spørge om jeg skal vælge "Win32 Application" eller "Win32 Console Application" når jeg skal lave et dos program ?
Avatar billede jpk Nybegynder
11. april 2003 - 12:39 #6
Vælg "Win32 Console Application"
Avatar billede george Nybegynder
11. april 2003 - 12:45 #7
Det virker jo fint, men hvad med parameteren ?
Avatar billede segmose Nybegynder
11. april 2003 - 12:46 #8
Hvis du virkelig mener dos (msdos 6, freedos) og du bruger Borland kan du bruge følgende:

#include <dos.h>
void delay(unsigned milliseconds);

Description

With a call to delay, the current program is suspended from execution for the number of milliseconds specified by the argument milliseconds. It is no longer necessary to make a calibration call to delay before using it. delay is accurate to a millisecond.

Return Value

None.
Avatar billede gumbert Nybegynder
11. april 2003 - 12:47 #9
Prøvede koden og fik en fejl pgr "stdafx" så jeg fjernede den. Nu virker det nogenlunde men hvis jeg prøver at ændre lidt på den så den skal skrive et bogstav ad gangen med delay imellem hver så laver den en lang pause og skriver hele sætningen.

koden jeg prøvede:

#include <Windows.h>
#include <iostream.h>

int main(int argc, char* argv[])
{
    cout << "H";
    Sleep(1000);
    cout << "a";
    Sleep(1000);
    cout << "l";
    Sleep(1000);
    cout << "l";
    Sleep(1000);
    cout << "o";

    return 0;
}

(jeg bruger MVC)
Avatar billede george Nybegynder
11. april 2003 - 12:49 #10
Det Dos under W2000
Avatar billede jpk Nybegynder
11. april 2003 - 12:51 #11
Det har jo intet med Sleep at gøre, det er fordi input er buffered!
Brug flush for at løse problemet:

cout << "Before delay" << flush;
Avatar billede jpk Nybegynder
11. april 2003 - 12:52 #12
Eller i dit eks:

cout << "H";
    Sleep(1000);
    cout << "a" << flush;
    Sleep(1000);
    cout << "l" << flush;
    Sleep(1000);
    cout << "l" << flush;
    Sleep(1000);
    cout << "o" << flush;
Avatar billede george Nybegynder
11. april 2003 - 12:56 #13
Har prøvet det. Hvis jeg skriver sleep 10 skulle "After Delay" skrives på skærmen efter 10 sekunder ??? Skriver det med det samme.
Avatar billede jpk Nybegynder
11. april 2003 - 13:02 #14
Det er millisekunder, altså:
1000 = 1 sekund
10000 = 10 sekunder
Avatar billede george Nybegynder
11. april 2003 - 13:04 #15
Ja det har du ret i. Men prøv selv lige at kører den. Den venter ikke 10sek med skrive på skærmen. ( After Delay )
Avatar billede jpk Nybegynder
11. april 2003 - 13:05 #16
Jo den gør!
Avatar billede george Nybegynder
11. april 2003 - 13:07 #17
Ok. Prøver lige at teste igen.
Avatar billede george Nybegynder
11. april 2003 - 13:11 #18
Skriver du : sleep 10000 ? ( for 10 sek. )

Min vender tilbage med det samme. Der går ikke 10 sek. Hvad pokker gør jeg galt ?
Avatar billede jpk Nybegynder
11. april 2003 - 13:15 #19
#include <Windows.h>
#include <iostream.h>

int main(int argc, char* argv[])
{
    cout << "Before delay" << endl;
    DWORD dwStart = GetTickCount();
    Sleep(10000);
    DWORD dwEnd = GetTickCount();
    cout << "After delay (took approx. " << (dwEnd-dwStart)/1000 << " seconds)" << endl;

    return 0;
}

Tager ca. 10 sekunder og giver teksten:
Before delay
After delay (took approx. 10 seconds)
Avatar billede george Nybegynder
11. april 2003 - 13:19 #20
Har sat din kode ind og får fejlen :
Compiling...
Sleep.cpp
c:\program files\microsoft visual studio\jk\sleep\sleep.cpp(19) : fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe.
Avatar billede jpk Nybegynder
11. april 2003 - 13:22 #21
Jeg fjernede #include "stdafx.h" fordi du skrev at det ikke virkede når den var der!!!
Det giver fejlen!
Avatar billede george Nybegynder
11. april 2003 - 13:29 #22
Jamen den har jeg også fjernet.

Min kode ser sålades ud :
// Sleep.cpp : Defines the entry point for the console application.
//

#include <Windows.h>
#include <iostream.h>

int main(int argc, char* argv[])
{
    cout << "Before delay" << endl;
    DWORD dwStart = GetTickCount();
    Sleep(10000);
    DWORD dwEnd = GetTickCount();
    cout << "After delay (took approx. " << (dwEnd-dwStart)/1000 << " seconds)" << endl;

    return 0;
}
Avatar billede jpk Nybegynder
11. april 2003 - 13:32 #23
Okay, prøv nu at indsætte
#include "stdafx.h"
som det første kode (lige over de andre includes)

Hvad sker der så når du kompilerer?
Avatar billede george Nybegynder
11. april 2003 - 13:43 #24
Efter jeg har indsat #include "stdafx.h" virker det perfekt. Du må have misforstået det med at fjerne #include "stdafx.h" for jeg syntes ikke at jeg kan læse ud af teksten at jeg har fjernet den.

Nå, men nu virker det perfekt. Tak for hurtig hjælp.
Avatar billede jpk Nybegynder
11. april 2003 - 13:47 #25
Undskyld, det var gumbert der i sit indlæg skrev at han fjernede stdafx.h...
Avatar billede george Nybegynder
11. april 2003 - 13:55 #26
Var vist lidt for hurtig. Den er ligeglad med om jeg skriver 6, 10 eller 60 efter sleep, så vender den tilbage efter 120 sek ????
Avatar billede george Nybegynder
11. april 2003 - 13:55 #27
Hov!!! efter 10 sek. selvfølgelig.
Avatar billede jpk Nybegynder
11. april 2003 - 14:03 #28
Har du glemt at kompilere..?
Avatar billede george Nybegynder
11. april 2003 - 14:07 #29
Ja. Jeg prøvede lige en gang til for en sikkerheds skyld, men den vender stadig tilbage efter ca. 10 sek. uanset tallet jeg sætter efter Sleep.
Avatar billede jpk Nybegynder
11. april 2003 - 14:10 #30
Med "uanset tallet jeg sætter efter Sleep", mener du uanset hvilket tal du giver som argument til Sleep, ikke?

Altså:
Sleep(500); // Sov 1/2 sekund
Sleep(1000); // Sov 1 sekund
Sleep(3000); // Sov 3 sekunder
Avatar billede gumbert Nybegynder
11. april 2003 - 14:33 #31
Fik det til at virke. Tak for hjælpen og undskyld min kommentar lavede kludder i besvarelsen :)
Avatar billede george Nybegynder
11. april 2003 - 14:39 #32
Hmm... Jeg forstår det ikke. Hvis jeg skriver sleep(20); så "sover" den kun 10,27 sek. ???
Avatar billede jpk Nybegynder
11. april 2003 - 14:47 #33
Hvad mener du med KUN???
Hvis du skriver Sleep(20); skulle den gerne sove i ca. 20 millisekunder, altså 1/50 af et sekund!
Avatar billede george Nybegynder
11. april 2003 - 14:50 #34
Undskyld. Sleep(20000); ( samme resultat )
Avatar billede jpk Nybegynder
11. april 2003 - 14:57 #35
Hmm, det lyder altså som om du ikke har rekompileret koden...
Bruger du VC++ 6.0?
I så fald kan du kompilere ved tryk på F7 og køre programmet med Ctrl+F5
Avatar billede george Nybegynder
11. april 2003 - 15:01 #36
Ja jeg bruger VC++ 6.0. Jeg tror godt jeg ved hvor fejlen er. Kan du ikke lige vise mig al din kode. Der står jo stadig Sleep(10000) i sourcekoden.
Avatar billede jpk Nybegynder
11. april 2003 - 15:04 #37
Hvis det ikke er i source koden du retter, hvor er det så???
Avatar billede george Nybegynder
11. april 2003 - 15:12 #38
Jeg forstår ikke hvad du mener. I sourcekoden er der en linje hvor der står Sleep(10000); og derfor vender den jo tilbage efter 10 sek. uanset hvad jeg skriver i dos vinduet. Skal den ikke ændres til Sleep(parameternavn); ??

Og hvad er det så der skal stå i stedet for parameternavn ??
Avatar billede jpk Nybegynder
11. april 2003 - 15:14 #39
Jo selvfølgelig!
Det er jo din kode der bliver kørt, ikke et eller andet du skriver i et vindue!
Avatar billede george Nybegynder
11. april 2003 - 15:16 #40
Hvad skal der stå i stedet for Sleep(parameternavn);

Sleep(argv[]); ????
Sleep(argc); ????
Avatar billede jpk Nybegynder
11. april 2003 - 15:26 #41
Hvis du vil kunne angive hvor lang tid programmet skal sove, kan du gøre sådan:

int main(int argc, char* argv[])
{
    int nSleepValue = 1000; // Default to 1 second
    if(argc > 1)
        nSleepValue = atoi(argv[1]);
    cout << "Before delay" << endl;
    DWORD dwStart = GetTickCount();
    Sleep(nSleepValue);
    DWORD dwEnd = GetTickCount();
    cout << "After delay (took approx. " << (dwEnd-dwStart)/1000 << " seconds)" << endl;

    return 0;
}
Avatar billede george Nybegynder
11. april 2003 - 15:36 #42
Jeg tror snart jeg giver op.

Nu har jeg kopieret din kode ind og kompileret og lavet en .exe fil.

Når jeg skriver sleep(20000); i et dos vindue som burde få den til at "sove" i 20 sek. vender den tilbage med det samme og skriver "After delay ......" med det samme i stedet for at vente 20 sek. ???
Avatar billede jpk Nybegynder
11. april 2003 - 15:38 #43
Hvis din .exe-fil hedder Sleep, skal du skrive:
Sleep 20000
Avatar billede george Nybegynder
11. april 2003 - 15:45 #44
Nu virker det. Men du skrev jo kl. 14.10 at det skulle være Sleep(3000); så derfor har jeg hele tiden testet det sådan.

Tak for hjælpen.
Avatar billede jpk Nybegynder
11. april 2003 - 16:01 #45
Det er koden der skal være på formen Sleep(x).
Jeg skrev jo netop om du mente det tal du giver som argument til Sleep funktionen.

Har du skrevet noget om at du vil have argumentet som input på kommandolinien?
Avatar billede george Nybegynder
11. april 2003 - 16:04 #46
Ja jeg skrev i starten at jeg ville have en parameter med. Men det er ligegyldigt nu for det virker perfekt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester