Целое число не обновляется потоком c # - PullRequest
0 голосов
/ 31 мая 2011

Я объявил в C # статический public int, что int передается потоку в его конструкторе. Работа потока очень проста, чтобы увеличить его, но этого не происходит Здесь я объявляю статическое значение:

class Global
{
    static public  int hardcap = 100;
    public int speed;
    static public Semaphore myhitpoints = new Semaphore(1, 1);
    static public Semaphore oponenthitpoints = new Semaphore(1, 1);
   static  public int mhp = 100;
    static public int ohp = 100;
    static public int mmana = 0;
    static public int omana = 0;
  public static Charm dragonblade = new   Charm(10, 30, 3, myhitpoints, oponenthitpoints, mhp, ohp, "dragon blade", mmana);
  public  static  Charm dragonshield = new Charm(30, 10, 5, myhitpoints, oponenthitpoints, mhp, ohp, "dragon shield", mmana);
    public static Charm b1charm;
    public static  Charm b2charm;
    public static Opponent enemy;

}

class ManaWell
    {
        int mana_regen;
        int cap = 1000;
        int target;
        public ManaWell(int x, int y)
        {
           mana_regen = x;
            target = y;
        }
        public void Refill()
        {
            while (true)
            {
               // if (this.target + mana_regen <= cap)
                if (target+mana_regen<cap)
                {
                    Thread.Sleep(3000);
                    target += mana_regen;
                    MessageBox.Show(target.ToString());

                }
            }
        }
    }
 ManaWell mw1 = new ManaWell(20,Global.mmana);
        ManaWell mw2 = new ManaWell(20,Global.omana);

        Thread tmw1 = new Thread(new ThreadStart(mw1.Refill));
        Thread tmw2 = new Thread(new ThreadStart(mw2.Refill));

        tmw1.Start();
        tmw2.Start();

Таким образом, цель работает хорошо, но у не будет увеличиваться.

Ответы [ 3 ]

4 голосов
/ 31 мая 2011

Целое число передается как значение и получает локально увеличение. это не увеличит статическую переменную, которую вы передаете в

Значение по сравнению с ссылочными типами

Если вы хотите, чтобы ваша внешняя статическая переменная обновлялась, вы можете использовать ключевое слово ref .

Кроме того, вы должны синхронизировать доступ к переменной при доступе к ней из нескольких потоков ...

если у вас есть «цели», которые должны быть сохранены и вызваны позже, вы должны передать делегату (который указывает на метод обновления) конструктор. этого делегата вы можете сохранить и позвонить позже

0 голосов
/ 31 мая 2011

Когда вы создаете свой объект ManaWell и передаете переменную, это будет только значение переменной, назначенное для цели.Поэтому, когда вы добавляете к цели, вы делаете только это;переданная переменная не будет затронута (как вы видите.)

Если вы действительно передаете публичный статический int, то для его увеличения просто выполните математические вычисления непосредственно (и вы недаже не нужно передавать его):

MyClass.MyStaticInt += aNumber;
0 голосов
/ 31 мая 2011

Причина в том, что значение переменной передается в конструктор. Вы только увеличиваете переменную local для своего класса.

...