Kezdőoldal » Számítástechnika » Programozás » Lehet valamivel helyettesíteni...

Lehet valamivel helyettesíteni a do while-t?

Figyelt kérdés
C#-ban csinálok egy programot, de a do while alatt "alkalmazás nem válaszol" fül jön fel. Valamivel lehet helyettesíteni a do while-t vagy másik irányból kellene megközelíteni a dolgot?

2019. febr. 5. 14:25
1 2
 11/19 anonim ***** válasza:
100%
Ettől mit vársz? Vár, hogy 16:00 legyen, addig semmit nem csinál. Nem ezt akartad?
2019. febr. 5. 22:34
Hasznos számodra ez a válasz?
 12/19 tabaki ***** válasza:
Eltekintve attól, hogy esetleg másképp is meg lehetne oldani az idő figyelését, az volna a minimum, hogy az else-ágban is történjen valami -- mondjuk a programnak az a része, amelyik nem pontosan délután négykor esedékes. Azt meg nem értem, miért muszáj a kellemetlenül ékezetes nevű változó változót unos-untalan lenullázni. Nem volna elég egyszer a ciklus előtt, amikor úgyis csak a várva várt nagy esemény változtatja meg? De az időpont egyenlőségre vizsgálása is rafinált fortély: Ha a program ismeretlen többi része esetleg egy percnél tovább totojázik, akkor biztosítva van, hogy a számlálót átlépve egy teljes újabb napig tevékenykedjen. Így helyes, arra való a gép, hogy dolgozzon.
2019. febr. 6. 00:34
Hasznos számodra ez a válasz?
 13/19 anonim ***** válasza:
Na, pontosan ez a végtelen ciklus.
2019. febr. 6. 07:04
Hasznos számodra ez a válasz?
 14/19 tabaki ***** válasza:
Hm, eddig nem is néztem, mi a program kívánt időpontban elvégzendő feladata... Ha jól értem, a hálózatot akarod lekapcsolni, vagyis akkor valószínűleg nem is akarod, hogy egyebet is csináljon, inkább azt, hogy csak kuksoljon a sarokban, míg el nem jön az ideje. Mivel nem értek hozzá, fogalmam sincs, hogyan kéne ezt kivitelezni (talán timerrel?), de le merném fogadni, hogy nem egy kerge birkaként körbe rohangáló do-while ciklus a megoldás. Mindenesetre a nagy általánosságban föltett kérdésen túl érdemesebb lett volna a célodat is pontosabban körülírni.
2019. febr. 6. 08:55
Hasznos számodra ez a válasz?
 15/19 anonim ***** válasza:

Szolgáltatásként lehet megírni, amit akarsz:

[link]

2019. febr. 6. 09:13
Hasznos számodra ez a válasz?
 16/19 anonim ***** válasza:

Kérdező, bocsi, de ez a polling lehető legcsúnyább és legfeleslegesebb alkalmazása. Ezen még a külön szál sem sokat segít, mert akkor is feleslegesen dolgozik a gép a háttérben.

A főkérdésre válaszolva, úgy keress rá, hogy pl. 'c# job scheduling'.

2019. febr. 6. 10:28
Hasznos számodra ez a válasz?
 17/19 uno20001 ***** válasza:
Tanulság: a UI szálon nem szabad hosszú ideig futó, vagy nagy számításigényű kódot futtatni.
2019. febr. 6. 20:19
Hasznos számodra ez a válasz?
 18/19 anonim ***** válasza:

Hát ez szörnyű.

Az utolsó 4-5 hsz le is írja, hogy miért.


A service-ek írása neked még sok lenne, ha ezzel is így vergődsz. A timer lesz a megoldás a problémádra, és akkor el is felejtheted a (bűnronda) loop-odat.


az időt meg elég /talán/ 1 secundumonként is lekérdezni, a feltétel pedig, ahogy Tabaki is írja, nem == hanem >= kell legyen.

2019. febr. 7. 10:31
Hasznos számodra ez a válasz?
 19/19 tabaki ***** válasza:

#18: „nem == hanem >= kell legyen”


Félretéve, hogy a programod egyébként is használhatatlan, #18 javaslata sem működik benne, ugyanis az időt, meglepő ötlettel, stringként kérdezed le. Ha a feltételt így módosítom:

if (idő >= "16:00")

...a fordító nem fogadja el:

error CS0019: Operator `>=' cannot be applied to operands of type `string' and `string'

Ha viszont ehelyett közvetlenül az óra integer-értékét vizsgálnád, akkor működne is, meg az idő változó is fölöslegessé válna, pl.:

if (DateTime.Now.Hour >= 16) {stb.}

vagy csak:

if (DateTime.Now.Hour > 15) {stb.}

Természetesen megeshet, hogy mégsem kerek órakor akarod akarsz akciózni, hanem mondjuk 16 óra 24 perckor. Ekkor megint szerepet kaphatna egy időpontot rögzítő objektum, de az hadd ne legyen már string, hanem értelemszerűen maga is DateTime. Ekkor a ciklusod kb. így nézne ki (a teendők sorát az áttekinthetőség kedvéért engedelmeddel a Lekapcsolas() hivatkozásra cseréltem, mintha egy ilyen nevű metódusba lennének téve):

DateTime ido;

bool fut = true;

do{

      ido = DateTime.Now;

      if (ido.Hour > 15 && ido.Minute > 23) {

            Lekapcsolas();

            fut = false;

      }

} while (fut);

Az aktuális időpontnak az ido-be másolása biztosítaná, hogy az óra és perc kettős vizsgálata közben már ne történhessen változás. Szükség esetén akár a másodperceket vagy ezredmásodperceket is figyelhetnéd ugyanígy (ido.Second, illetve ido.Millisecond), de még egyszer: Mindezt nem azért írtam, mintha ebben a formájában bármi módon is megoldaná, amit akarsz. Szándékom szerint ez csak az általad bemutatott eleve értelmetlen ciklusnak a valamivel megfontoltabb újrafogalmazása, hátha így is akad valamikor-valamire még használható eleme.

2019. febr. 7. 12:35
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!