Kezdőoldal » Számítástechnika » Programozás » C# windows form-ban, hogy...

C# windows form-ban, hogy tudnák ilyen végtelen ciklust csinálni?

Figyelt kérdés
Van egy vagyon változó és két külön szálról kap értékeket végtelen ideig, az egyikről másodpercenként 2-őt, a másikról 10másodpercenként 5-öt és mindezt úgy, hogy közben tudjam fejleszteni ezeket és a vagyonból tudjak elkölteni.Sehogy se jó, ahogy csinálom, mindig kifagy vagy hibás.
2019. dec. 3. 16:01
 1/10 anonim ***** válasza:
Nem látom a problémát.
2019. dec. 3. 16:49
Hasznos számodra ez a válasz?
 2/10 anonim ***** válasza:
Kód? Hibaüzenet?
2019. dec. 3. 18:51
Hasznos számodra ez a válasz?
 3/10 A kérdező kommentje:
Hát nem tudom, most thread-et, while(true) ciklust kellene alkalmazni vagy valami egészen mást...
2019. dec. 3. 19:24
 4/10 anonim ***** válasza:
Egy Timer miért nem jó?
2019. dec. 3. 20:16
Hasznos számodra ez a válasz?
 5/10 anonim ***** válasza:
keress rá a thread safety ín c# kulcsszóra, ha megérted garantáltan megoldódik a probléma, jelenleg az a helyzet, hogy ugye előfordulhat, hogy az adott változót egyszerre módosítod, és a rendszer nem tudja eldönteni, hogy most melyik fusson le először / összeakad, érte vannak különböző megoldások (én javahoz értek, ott pl a synchornized, vagy thread safe adattipusok)
2019. dec. 4. 07:34
Hasznos számodra ez a válasz?
 6/10 anonim ***** válasza:
C#-ban lockolni lehet olyan elemeket amik referencia típusúak, ezáltal amíg az egyik szál dolgozik az elemmel másik szál nem tud benne módosítani semmit.
2019. dec. 4. 09:21
Hasznos számodra ez a válasz?
 7/10 anonim ***** válasza:
100%

object qlock = new object(); //osztály szintű változóknak

int vagyon = 0;


public IndítKonstruktor(){

//TaskCreationOptions.LongRunning hogy mindenképp külön szálon fusson

new Task(ElsoSzálVárakozáhely, TaskCreationOptions.LongRunning).Start();

new Task(MásodikSzálVárakozóhely, TaskCreationOptions.LongRunning).Start();

}


public ElsoSzálVárakozóhely(){

while (true){

Hozzáad(2);

Thread.Sleep(1000);

}

}


public MásodikSzálVárakozóhely(){

while (true){

Hozzáad(5);

Thread.Sleep(10000);

}

}


public void Hozzáad(int x){

lock (qlock)

{

vagyon += x;

}

}


public void Elkölt(int x){

lock (qlock)

{

vagyon -= x;

}

}



Amíg az egyik szál benn van a lock-ban addig nem engedi a másikat.

2019. dec. 5. 08:23
Hasznos számodra ez a válasz?
 8/10 anonim ***** válasza:
100%
void-okat lehagytam, de remélem érthető
2019. dec. 5. 09:03
Hasznos számodra ez a válasz?
 9/10 anonim ***** válasza:
100%

Vagy lockolod ahogy fentebb írták, vagy használod az Interlocked.Add metódust:

[link]

2019. dec. 5. 10:49
Hasznos számodra ez a válasz?
 10/10 A kérdező kommentje:
köszönöm szépen a segítséget! :)
2019. dec. 5. 16:48

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!