[C++] Press any key within x seconds

Pagina: 1
Acties:

  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
Hallo,

hoe krijg ik dat voor elkaar met c++, dat ie bijv. aftelt van 10 naar 0, als je binnen die tijd een toets indrukt doet ie iets, druk je binnen die tijd geen toets in dan gebeurt er iets anders... ? Moet mogelijk zijn... lukte me niet met for/while loops enzo.

In pascal kon je heel makkelijk dmv repeat-until keypressed ofzo, maar schijnt niet te kunnen in c++ ??

edit:
kent c++ ook geen delay(x) ?
Zowel, kan c++ dan tijdens die delay wel toetsen van je keyboard inlezen?

Wat een onzin..


  • Aaargh!
  • Registratie: Januari 2000
  • Laatst online: 21:21

Aaargh!

Bow for me for I am prutser

Je kan wel sleep() gebruiken.

je zou b.v. een for lusje kunnen maken en dan 10 keer een sleep van 1 seconde, waarna je het keyboard probeert uit te lezen.
Er zijn vast wel nettere oplossingen, maar dit is zo het eerste wat bij me opkwam.

je kan trouwens usleep gebruiken als je tijden kleiner dan 1 seconde wilt

Those who do not understand Unix are condemned to reinvent it, poorly.


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Bouw dan twee eventhandlers: eentje die na 10 seconden afgaat, en eentje die na een keypress afgaat. Beiden hoeven alleen een boolean'tje op true te zetten, waarna je aan een while(!dieboolean){} genoeg hebt :)


Journalism is printing what someone else does not want printed; everything else is public relations.


  • Aaargh!
  • Registratie: Januari 2000
  • Laatst online: 21:21

Aaargh!

Bow for me for I am prutser

Op dinsdag 04 juni 2002 17:39 schreef Rat het volgende:
Beiden hoeven alleen een boolean'tje op true te zetten, waarna je aan een while(!dieboolean){} genoeg hebt :)
Waarmee je dus een busy-wait creert, iets wat je NOOIT moet doen op een multi-tasking OS, en meteen maar ff het nut van event-handlers omzeilt.

Those who do not understand Unix are condemned to reinvent it, poorly.


  • iznogood
  • Registratie: September 2001
  • Niet online
Of zoiets :

- Maak een globale variabele bool TijdVoorbij
- Maak op het formulier/label/watdanook een onkey event aan
- Zorg dat het formulier/label/watdanook de focus heeft
- Enable een timer die er 10 sec over doet.
- In de Timer event zet je de bool TijdVoorbij=true

Als er nu op een toets gedrukt wordt als TijdVoorbij false is dan is er op een toets gedrukt binnen de 10 sec.

Just as Good


  • Avalanchez
  • Registratie: Juni 2002
  • Laatst online: 25-06-2012

Avalanchez

Phr34k

Op dinsdag 04 juni 2002 17:11 schreef dixon het volgende:
Hallo,

hoe krijg ik dat voor elkaar met c++, dat ie bijv. aftelt van 10 naar 0, als je binnen die tijd een toets indrukt doet ie iets, druk je binnen die tijd geen toets in dan gebeurt er iets anders... ? Moet mogelijk zijn... lukte me niet met for/while loops enzo.

In pascal kon je heel makkelijk dmv repeat-until keypressed ofzo, maar schijnt niet te kunnen in c++ ??

edit:
kent c++ ook geen delay(x) ?
Zowel, kan c++ dan tijdens die delay wel toetsen van je keyboard inlezen?
welk os?

windows heeft een api functie sleep en die zit in kernel32.dll

ps, bcpp gebruikt kent wel een delay functie, maar die is geen ansi-c++, dus denk ik niet dat andere compilers het standaard kennen

Computers are stupid, they can only give you answers. -Picasso


  • Aaargh!
  • Registratie: Januari 2000
  • Laatst online: 21:21

Aaargh!

Bow for me for I am prutser

Op dinsdag 04 juni 2002 20:12 schreef Avalanchez het volgende:
windows heeft een api functie sleep en die zit in kernel32.dll
Die heeft Unix ook, zit in unistd.h

Those who do not understand Unix are condemned to reinvent it, poorly.


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
Ik gebruik zelf Windows 2000 en Borland C++ 5.02, maar het gaat om een dos-programma wat moet runnen onder Windows 98.

Edit: Heb ook Turbo C++ Lite compiler.. wil weleens verschillen vraag me niet waarom...

Wat een onzin..


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:42
Op dinsdag 04 juni 2002 21:23 schreef dixon het volgende:
[..] dos-programma wat moet runnen onder Windows 98.
Ik vrees dat DOS geen ondersteuning heeft voor iets dergelijks. Het dichste wat in de buurt komt is een delay (zoek 'm maar op), die door Windows 98 hopelijk als sleep wordt geinterpreteerd.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 04 juni 2002 21:28 schreef Soultaker het volgende:

[..]

Ik vrees dat DOS geen ondersteuning heeft voor iets dergelijks. Het dichste wat in de buurt komt is een delay (zoek 'm maar op), die door Windows 98 hopelijk als sleep wordt geinterpreteerd.
waarschijnlijk is het geen DOS app, maar een windows app in een DOS window, daar hij BCB 5 gebruikt

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:42
Op dinsdag 04 juni 2002 21:54 schreef .oisyn het volgende:
waarschijnlijk is het geen DOS app, maar een windows app in een DOS window, daar hij BCB 5 gebruikt
Als het een DOS applicatie is, draait 't onder Windows in een DOS venster, en vice versa. Jij suggereert waarschijnlijk dat 't om een console applicatie gaat.

Als dat inderdaad het geval is, noem het dan alsjeblieft ook zo. Dit wekt alleen maar verwarring op. In dat geval kun je gewoon gebruik maken van de Windows API en dus gebruik maken van sleep of (nog mooier) de Windows message queue. Als je alleen voor deze feature een message loop moet implementeren, zou ik toch voor de variant met sleep en een lusje kiezen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

console app idd
door al dat geroep over een DOS window ga je het zelf ook gebruiken :D
(hoewel 'windows app in dos window' vrij duidelijk is vind ik zelf...)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:14

mulder

ik spuug op het trottoir

Op dinsdag 04 juni 2002 22:01 schreef .oisyn het volgende:
console app idd
door al dat geroep over een DOS window ga je het zelf ook gebruiken :D
(hoewel 'windows app in dos window' vrij duidelijk is vind ik zelf...)
Of een DOS App in een Windows window. Een app in een console window zal dus eerder draaien onder Windows dan een Window app onder DOS. :? Pffff, slapen

oogjes open, snaveltjes dicht


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Op woensdag 05 juni 2002 00:46 schreef Don Facundo het volgende:

[..]

Of een DOS App in een Windows window. Een app in een console window zal dus eerder draaien onder Windows dan een Window app onder DOS. :? Pffff, slapen
Jah, euh... 't is gewoon een CONSOLE subsystem application :)

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • PromWarMachine
  • Registratie: Oktober 2001
  • Laatst online: 04-09 21:51

PromWarMachine

Forsaken Archer

Op dinsdag 04 juni 2002 17:11 schreef dixon het volgende:
Hallo,

hoe krijg ik dat voor elkaar met c++, dat ie bijv. aftelt van 10 naar 0, als je binnen die tijd een toets indrukt doet ie iets, druk je binnen die tijd geen toets in dan gebeurt er iets anders... ? Moet mogelijk zijn... lukte me niet met for/while loops enzo.

In pascal kon je heel makkelijk dmv repeat-until keypressed ofzo, maar schijnt niet te kunnen in c++ ??

edit:
kent c++ ook geen delay(x) ?

Zowel, kan c++ dan tijdens die delay wel toetsen van je keyboard inlezen?
Nee, niet in die vorm.

De Borland compiler die ik gebruik kent wel Sleep(x), let hierbij op de hoofdletter (zonder hoofdletter doet hij het namelijk niet) en die zit in de library <windows.h> als ik mij niet vergis.

Ben bang dat hij tijdens die delay geen toetsen kan inlezen, maar waarschijnlijk zet hij hem wel in de keyboardbuffer, zodoende kan je 10 x 1 seconde maken en tussendoor controleren of er al gedrukt is :)

Dividend for Starters


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
code:
1
2
3
while(!kbhit())
{
}

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 05 juni 2002 15:18 schreef whoami het volgende:
code:
1
2
3
while(!kbhit())
{
}
mmja maar dat zorgt dus weer voor een busy wait loop

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
Geeft dat dan in een single-task omgeving? Het lijkt me dat die DOS box dan wel 'busy' blijft, maar dat je andere app's in Windows gewoon verder kunnen. Die DOS box is trouwens een proces in Windows.

Ik denk trouwens dat het aardig in de buurt komt van z'n Pascal oplossing die hij in z'n openingspost heeft vermeld.

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 05 juni 2002 19:11 schreef whoami het volgende:
Geeft dat dan in een single-task omgeving? Het lijkt me dat die DOS box dan wel 'busy' blijft, maar dat je andere app's in Windows gewoon verder kunnen. Die DOS box is trouwens een proces in Windows.

Ik denk trouwens dat het aardig in de buurt komt van z'n Pascal oplossing die hij in z'n openingspost heeft vermeld.
andere apps komen idd wel aan de beurt, maar niet diegene met een lagere prioriteit (uiteindelijk weer wel door priorityboosting, maar het is vrij offtopic om het nu te gaan hebben op het windows multitasking systeem).

En ook een side-effect is dat je cpu voor 100% wordt gebruikt

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
Hoe los je het dan op in een DOS omgeving? Volgens mij kent die geen Timers ea.

https://fgheysels.github.io/


  • Aaargh!
  • Registratie: Januari 2000
  • Laatst online: 21:21

Aaargh!

Bow for me for I am prutser

Op woensdag 05 juni 2002 19:11 schreef whoami het volgende:
Geeft dat dan in een single-task omgeving?
Nee, maar het moet in een DOS-box onder windows 98 draaien dus we hebben het hier over een multi-tasking-achtige omgeving
Het lijkt me dat die DOS box dan wel 'busy' blijft, maar dat je andere app's in Windows gewoon verder kunnen. Die DOS box is trouwens een proces in Windows.
Juist, en dus vreet ie CPU tijd van de rest v/h systeem terwijl hij niks doet.

Those who do not understand Unix are condemned to reinvent it, poorly.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
Op woensdag 05 juni 2002 21:08 schreef Aaargh! het volgende:

Juist, en dus vreet ie CPU tijd van de rest v/h systeem terwijl hij niks doet.
Maar hij vreet toch maar 100% CPU als die DOS-box aan de beurt is?

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 05 juni 2002 20:00 schreef whoami het volgende:
Hoe los je het dan op in een DOS omgeving? Volgens mij kent die geen Timers ea.
het is gewoon een windows console app volgens mij hoor :?
en dus kun je de win API gebruiken (en misschien is delay () ook wel geimplementeerd als Sleep ())

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
Dit is wat ik tot nu to heb, vervelende is alleen dat je systeem steeds 1 seconde hangt door die timeout. Als je dus een toets indrukt, duurt het ook 1 seconde voordat ie erop reageert... volgens mij geeft dit ook het probleem dat als je bij de laatste seconde een toets indrukt, dat ie er niet op reageert.. kan wel bij cout << "To launch setup etc" van die timeout die afgedrukt wordt, timeout-1 maken... maar dat lost niet echt het probleem op. Btw, zoals je ziet is sleep in secondes, ik wil iets in milisecondes...?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream.h>
#include <conio.h>
#include <dos.h>

int main(void)
{
 int timeout = 3;

 do
 {
  gotoxy(1,1); cout << "To launch setup, press any key within " 
              << timeout << " seconds...\n";
  timeout --;
  sleep(1);
 } while (!kbhit() && timeout != 0);
 if ( timeout != 0) cout << "You pressed a key...";
 if ( timeout == 0) cout << "You didn't pressed a key...";
 cin.get();
}

Edit: Ik heb even code-tags in uw post gezet. Doe dat in het vervolg aub zelf. Het bevordert de leesbaarheid.

Wat een onzin..


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
Op donderdag 06 juni 2002 15:26 schreef dixon het volgende:
Btw, zoals je ziet is sleep in secondes, ik wil iets in milisecondes...?
delay();
(Waarschijnlijk had je het zelf ook wel gevonden, als je in de help bij sleep() eens had gekeken naar 'see also' of iets in die aard).

https://fgheysels.github.io/


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
Sorry daarvoor... doe het volgende keer wel, zal ik ook eerst ff opzoeken hoe dat moet... btw ik wou nog iets aanpassen aan me post maar krijg nu error 69, kan niet omdat een moderator hem al heeft aangepast... :(

delay();
?? kent mijn compiler niet.. Borland C++ 5.02

Wat een onzin..


  • PromWarMachine
  • Registratie: Oktober 2001
  • Laatst online: 04-09 21:51

PromWarMachine

Forsaken Archer

Op donderdag 06 juni 2002 15:26 schreef dixon het volgende:
[..]
Zoals je ziet is sleep in secondes, ik wil iets in milisecondes...?
[..]
Je bedoeld "sleep(x)" uit dos.h, maar als je "Sleep(x)" uit windows.h gebruikt, is het wel degelijk in milliseconde.

Iemand boven mij zei "delay(x)", maar die heb ik nooit kunnen vinden in de Borland compiler, misschien omdat ik tevreden was met Sleep(x), maar dat weet ik niet meer.
Op donderdag 06 juni 2002 15:29 schreef dixon het volgende:

delay();
?? kent mijn compiler niet.. Borland C++ 5.02
Precies! :)

Dividend for Starters


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
Ik kan mis zijn hoor, 't is al een hele tijd geleden dat ik nog wat in C++ gedaan heb onder DOS.
die delay en die sleep functies zeggen mij iets, maar nu ik het zo bedenk nam die delay waarschijnlijk seconden als argument en die sleep milliseconden.
* whoami weet het niet meer zo goed.

https://fgheysels.github.io/


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
PromWarMachine, Sleep uit windows.h.... ja maar dan wordt het toch een 32bits programma? Hij is nu nog standaard dos en dat moet ook. Moet in pure dos kunnen draaien.

Wat een onzin..


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

kun je dan nog DOS apps maken met BC 5 ?
dacht dat dat maar met BC tot 4.5 kon

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
Oke, nu heb ik windows.h geinclude, en er Sleep(1000) van gemaakt... ik ga hem straks testen...

edit: er zit nog steeds die seconde vertraging in...

Wat een onzin..


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
.oisyn, jahoor dat kan.... zie hier:
http://people.a2000.nl/pscher00/bc502.jpg

Wat een onzin..


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

ah ok, weet ik dat ook weer :)
dan kun je idd geen Sleep() gebruiken (en dan hoef je dus ook geen rekening te houden met busy wait loops enzo)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
kan wel Sleep() gebruiken als ik windows.h include, maar dan wordt het volgens mij automatisch een win32 prog, en dat mag niet.

Wat een onzin..


Verwijderd

sleep(), sleep geeft de huidige timeslice op en geeft aan dat het proces moet worden geblocked voor het aantal aangegeven milliseconden...

delay() bestaat idd voor zover ik weet niet in C++, maar er bestaan wel andere dingen ;)

#include <time.h>

...

time_t t1 = time(NULL);
while (time(NULL) - t1 < 10) {
sleep(0); //Give up the current timeslice so
//that other programs can do their job
}

ik weet niet zeker of sleep standaard C++ is, of dat er misschien ene variant van is, dat zou je evt. even moeten nakijken als je zeker wil weten dat het 100% portable is.

overigens zou je de waarde van de sleep attribuut wel wat kunnen verhogen als de resolutie en de response time niet zo belangrijk zijn, door dit op 1 of 10 ofsow te zetten kun je waarschijnlijk al een hele hoge besparing maken in CPU gebruik.

Je zou ook clock() kunnen gebruiken ipv time() voor een hogere resolutie, maar dan moet je wel de snelheid van de clock cycles weten, ik weet niet of W98 die op de standaard 18.2 laat of veranderd, en overigens zou dit op andere platformen weer anders kunnen zijn.

Als je win32 wil gebruiken dan kun je ook QueryPerformanceCount() en QueryPerformanceFrequency() (of iets in die geest, kweet het niet meer 100% zeker uit m'n hoofd, ook is even de vraag of deze ondersteund worden in w98) gebruiken, deze geven allebij een 64 bit integer met respectievelijk de teller waarde en de teller frequentie, deze teller is hardwarematig en is echt belachelijk snel, dus als je echt een hoge resolutie nodig hebt dan zou je deze moeten gebruiken, het is alleen wel af te vragen of dit nog echt erg veel zin heeft in deze situatie mbt tot de response tijd van de Windows task scheduler... Die wordt waarschijnlijk toch door de timertick bepaald en dan zou je net zo goed clock() kunnen gebruiken...

Maargoed, ik hoop dat dit je helpt, succes ermee iig.

---------------------------------------------------------

time_t time ( time_t * timer );
Get current time.
Get the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC from the system clock.


Parameters.

timer
Location where to store the retrieved value. If this is NULL the value is not stored. But it is still returned by the function.
time_t is generally defined by default to long.
Return Value.
Elapsed time in seconds, as described.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 06 juni 2002 17:05 schreef Death_of_Rats het volgende:
ik weet niet zeker of sleep standaard C++ is, of dat er misschien ene variant van is, dat zou je evt. even moeten nakijken als je zeker wil weten dat het 100% portable is.
nope, sleep () is geen ANSI C (wel POSIX geloof ik), en er is ook geen ANSI C variant voor

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1