переменная c # не обновляется - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь создать приложение Xamarin для Android, где я записываю данные датчика ориентации. Я установил таймер, который работает на 10 мс и перезапускается 400 раз.

public void rogzit_Clicked(object sender, EventArgs e)        
        {                                           
            timer1 = new Timer();

            timer1.Interval = 10;
            timer1.Elapsed += Timer1_Elapsed;


            if (OrientationSensor.IsMonitoring)
            {
                rogzit.Enabled = false;
                for (int i = 0; i < 400; i++)
                {
                    jel = 1;
                    timer1.Start();

                    while (jel != 0)
                    {

                    }

                }               
                string mappa = Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDocuments).AbsolutePath;
                rogzit.Enabled = true;
                System.IO.File.WriteAllLines(mappa, array);
            }                       
        }
        private void Timer1_Elapsed(object sender, ElapsedEventArgs e)
        {

            timer1.Stop();
            idoo[db] = Convert.ToString(db * 0.01);
            meres[db] = szog.ToString("f2");
            array[db] = string.Format("{0} {1}", idoo[db], meres[db]);
            db += 1;
            jel = 0;
        }

Переменная szog должна измениться, но она останется прежней.

public void OrientationSensor_Readingchanged(object sender, OrientationSensorChangedEventArgs e)
        {
            xQ = e.Reading.Orientation.X;
            yQ = e.Reading.Orientation.Y;
            zQ = e.Reading.Orientation.Z;
            wQ = e.Reading.Orientation.W;

            double sinr_cosp = +2.0 * (wQ * xQ + yQ * zQ);
            double cosr_cosp = +1.0 - 2.0 * (xQ * xQ + yQ * yQ);
            xAngle = Math.Atan2(sinr_cosp, cosr_cosp);

            double sinp = +2.0 * (wQ * yQ - zQ * xQ);



            if (Math.Abs(sinp) >= 1)
            {
                if (sinp>0)
                {
                    yAngle = (Math.PI / 2);
                }
                else
                {
                    yAngle = -1 * (Math.PI / 2);
                }

            }
            else
            {
                yAngle = Math.Asin(sinp);
            }

            double siny_cosp = +2.0 * (wQ *zQ + xQ * yQ);
            double cosy_cosp = +1.0 - 2.0 * (yQ * yQ + zQ * zQ);
            zAngle = Math.Atan2(siny_cosp, cosy_cosp);

            double elojel;

            if (xAngle > 0)
            {
                elojel = 1;
            }
            else if (xAngle < 0)
            {
                elojel = -1;
            }
            else
            {
                elojel = 0;
            }

            szog = Math.Sqrt(yAngle * yAngle + xAngle * xAngle)*elojel;
            pf = szog.ToString("f2");
            szogErtek.Text = string.Format("{0} [rad]", pf);

In Orientationsensor_Readingchanged Я даю значение szog, которое меняется в зависимости от ориентации. Но оно остается тем же значением, что и при запуске rogzit_Clicked, и записывает это значение 400 раз.

1 Ответ

0 голосов
/ 03 октября 2019

Строка szogErtek.Text = string.Format("{0} [rad]", pf);, по-видимому, не вызывается в потоке пользовательского интерфейса, поскольку она находится внутри прослушивателя событий. Вы должны переместить часть задачи, которая обновляет пользовательский интерфейс, в основной поток с помощью Activity.RunOnUiThread. Итак, это должно выглядеть примерно так:

Activity.RunOnUiThread(szogErtek.Text = string.Format("{0} [rad]", pf));
...