Behöver en delay mellan varven i en loop || C++ Windows Forms

Trädvy Permalänk
Medlem
Registrerad
Nov 2015

Behöver en delay mellan varven i en loop || C++ Windows Forms

Som titeln säger behöver jag en fördröjning mellan varven i en loop. Har testat alla möjliga funktioner för att fördröja men fördröjningarna bara adderas och körs alla samtidigt. I loopen uppdaterar jag:

pictureBox->Visible = true;

Finns det någon funktion eller egenskap hos en picturebox som uppdaterar den eller vad tror ni problemet ligger i?
Har testat:

pictureBox->Invalidate();

Men problemet kvarstår.

Random^ rnd = gcnew Random; for ( int i = 0; i < level + 1; i++ ) { slump = rnd->Next(1, 17); switch (slump) { case 1: pbxKort1->Visible = true; pbxKort2->Invalidate(); paus(); break; case 2: pbxKort2->Visible = true; pbxKort2->Invalidate(); paus(); break; case 3: pbxKort3->Visible = true; pbxKort2->Invalidate(); paus(); break; case 4: pbxKort4->Visible = true; pbxKort2->Invalidate(); paus(); break; case 5: pbxKort5->Visible = true; pbxKort2->Invalidate(); paus(); break; case 6: pbxKort6->Visible = true; pbxKort2->Invalidate(); paus(); break; case 7: pbxKort7->Visible = true; pbxKort2->Invalidate(); paus(); break; case 8: pbxKort8->Visible = true; pbxKort2->Invalidate(); paus(); break; case 9: pbxKort9->Visible = true; pbxKort2->Invalidate(); paus(); break; case 10: pbxKort10->Visible = true; pbxKort2->Invalidate(); paus(); break; case 11: pbxKort11->Visible = true; pbxKort2->Invalidate(); paus(); break; case 12: pbxKort12->Visible = true; pbxKort2->Invalidate(); paus(); break; case 13: pbxKort13->Visible = true; pbxKort2->Invalidate(); paus(); break; case 14: pbxKort14->Visible = true; pbxKort2->Invalidate(); paus(); break; case 15: pbxKort15->Visible = true; pbxKort2->Invalidate(); paus(); break; case 16: pbxKort16->Visible = true; pbxKort2->Invalidate(); paus(); break; default: break; } }

Här är även min nuvarnade fördröjnings funktion:

void paus() { clock_t delay = 2 * CLOCKS_PER_SEC; clock_t start = clock(); while (clock() - start < delay) {} }

Tacksam för all hjäjp!
mvh
Frustrerad programmerare

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Apr 2010

@HappyDomba: Är du säker på att du inte kan lägga paus() i slutet (under din switch)?

Finns inte sleep?

Inget pro på C++ men:

#include <Mmsystem.h> //timeGetTime #include <WinBase.h> //Sleep void Stall(unsigned long ms) { unsigned long start = timeGetTime(); unsigned long passed = 0; while (passed < ms) { passed = timeGetTime() - start; Sleep(0); } }

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!

Trädvy Permalänk
Medlem
Registrerad
Sep 2006

Eller kanske...
void paus()
{
Sleep(2); // delay 2 sec
}
Edit: Kanske 2000 (millisec), 2 linux, 2000 win? minns inte.

Trädvy Permalänk
Medlem
Plats
Halland
Registrerad
Okt 2013

Jag kan inte heller c++ men Sleep() bör funka.

Dock kommer Sleep() frysa hela programmet om du inte lägger denna loopen i en egen thread.

Sedan kör du
pbxKort2->Invalidate();
i alla dina case
Du vill väl köra pbxKort(1 t.o.m 16)->Invalidate();
och sen visa din nya?

Trädvy Permalänk
Medlem
Registrerad
Apr 2013
Skrivet av HappyDomba:

Som titeln säger behöver jag en fördröjning mellan varven i en loop. Har testat alla möjliga funktioner för att fördröja men fördröjningarna bara adderas och körs alla samtidigt. I loopen uppdaterar jag:

pictureBox->Visible = true;

Finns det någon funktion eller egenskap hos en picturebox som uppdaterar den eller vad tror ni problemet ligger i?
Har testat:

pictureBox->Invalidate();

Men problemet kvarstår.

Random^ rnd = gcnew Random; for ( int i = 0; i < level + 1; i++ ) { slump = rnd->Next(1, 17); switch (slump) { case 1: pbxKort1->Visible = true; pbxKort2->Invalidate(); paus(); break; case 2: pbxKort2->Visible = true; pbxKort2->Invalidate(); paus(); break; case 3: pbxKort3->Visible = true; pbxKort2->Invalidate(); paus(); break; case 4: pbxKort4->Visible = true; pbxKort2->Invalidate(); paus(); break; case 5: pbxKort5->Visible = true; pbxKort2->Invalidate(); paus(); break; case 6: pbxKort6->Visible = true; pbxKort2->Invalidate(); paus(); break; case 7: pbxKort7->Visible = true; pbxKort2->Invalidate(); paus(); break; case 8: pbxKort8->Visible = true; pbxKort2->Invalidate(); paus(); break; case 9: pbxKort9->Visible = true; pbxKort2->Invalidate(); paus(); break; case 10: pbxKort10->Visible = true; pbxKort2->Invalidate(); paus(); break; case 11: pbxKort11->Visible = true; pbxKort2->Invalidate(); paus(); break; case 12: pbxKort12->Visible = true; pbxKort2->Invalidate(); paus(); break; case 13: pbxKort13->Visible = true; pbxKort2->Invalidate(); paus(); break; case 14: pbxKort14->Visible = true; pbxKort2->Invalidate(); paus(); break; case 15: pbxKort15->Visible = true; pbxKort2->Invalidate(); paus(); break; case 16: pbxKort16->Visible = true; pbxKort2->Invalidate(); paus(); break; default: break; } }

Här är även min nuvarnade fördröjnings funktion:

void paus() { clock_t delay = 2 * CLOCKS_PER_SEC; clock_t start = clock(); while (clock() - start < delay) {} }

Tacksam för all hjäjp!
mvh
Frustrerad programmerare

Testa med att köra wait-onload på din pictureboxar så att applikationen inte fortsätter förrän bilden är laddad.

Får man fråga vad du försöker göra? För en snabb läsning säger mig att du vill visa slumpmässig bild men varför så många pictureboxar? Försöker du göra ett whack-a-mole?

Trädvy Permalänk
Medlem
Registrerad
Nov 2015

@aluser: Jag ska göra ett spela som slumpar till en början 2 kort i en slumpmässig ordning, visar dem med 1 sekunds mellanrum för att sedan slockna igen. Användaren ska sedan klicka på korten i den ordning som dem visades upp. Om man klarar det slumpas 3 kort o.s.v.

WaitOnLoad är väl om man hämtar en bild. Jag har tilldelat alla pictureboxes varsin bild redan. Men det kunde du inte veta

Trädvy Permalänk
Medlem
Registrerad
Nov 2015

@freddyfresh: Har testat Sleep(1000) men får samma resultat då.

Trädvy Permalänk
Medlem
Registrerad
Nov 2015

Löste det guys!
Skulle vara:

pictureBox->Refresh();