Обновление пользовательского интерфейса из обработчика событий NFC-Tag-Reader выполняется очень медленно

Одна из возможностей - отключить ваш ExecutorService. Это остановит вашу отправленную задачу.

myExecutor.shutdown();
myExecutor.shutdownNow();

Если вы хотите запланировать ее снова, вам нужно создать новую ExecutorService жесткую, так как после ее выключения ее нельзя использовать повторно. Затем вы можете перенести свою задачу с новым значением для myString.

private void scheduleTask(ExecutorService service, String myString) {
    service.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            System.out.println(myString);
        }
    }, 0, 10000, TimeUnit.MILLISECONDS);
}
2
задан LarsTech 21 January 2019 в 16:13
поделиться

2 ответа

Не уверен, что это на самом деле: this.BackgroundImage = BackgroundWelcome;, но действительно ли необходимо каждый раз назначать такие статические данные?

Также я не думаю, что частота вашего события обновления слишком высока - информация на экране должна быть удобочитаемой, так что это определенно только одно обновление всех данных, необходимых после того, как весь тег будет прочитан. Если для каждого тега имеется много событий чтения - сохраните их во временный список и обновите форму в конце чтения (весь тег). Когда я говорю «метка», я имею в виду все содержимое карты mifare.

0
ответ дан Jesting 21 January 2019 в 16:13
поделиться

Обновление пользовательского интерфейса было в моем случае просто очистить метки (см. UpdateInterface ()). Однако я обнаружил «ошибку». Это был файл ".jpg" и BackgroundImage, который я загружал при каждом обновлении. Хотя это было «просто» 1280x1024, это было слишком много для обновления интерфейса.

Когда я очистил изображения, обновление было немедленно.

Мое решение теперь:

this.BackgroundImage = ((System.Drawing.Image(resources.GetObject("$this.BackgroundImage")));
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer | System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, true);

в Form1.Designer.cs

и Приостановка и возобновление макета со следующим классом (который я нашел где-то в Интернете) [ 117]

public static class ControlHelper
{
    #region Redraw Suspend/Resume
    [DllImport("user32.dll", EntryPoint = "SendMessageA", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
    private const int WM_SETREDRAW = 0xB;

    public static void SuspendDrawing(this Control target)
    {
        SendMessage(target.Handle, WM_SETREDRAW, 0, 0);
    }

    public static void ResumeDrawing(this Control target) { ResumeDrawing(target, true); }
    public static void ResumeDrawing(this Control target, bool redraw)
    {
        SendMessage(target.Handle, WM_SETREDRAW, 1, 0);

        if (redraw)
        {
            target.Refresh();
        }
    }
    #endregion
}

Также я изменил файлы ".jpg" на файлы ".bmp". Теперь интерфейс гладкий и быстрый.

И @Jesting:

Не уверен, что это на самом деле: this.BackgroundImage = BackgroundWelcome; но действительно ли необходимо назначать такие статические данные каждый раз?

Нет, я мог бы найти лучшее решение. Однако, поскольку приложение очень маленькое, и у меня есть только четыре фоновых изображения, мне было проще «жестко закодировать» его.

Наконец, тег (-reader) на самом деле не был проблемой.

А для обновления пользовательского интерфейса я использую эту довольно простую функцию:

private void UpdateInterface(PassportDatabaseReader.Passport _passport)
    {
        if (InvokeRequired)
        {
            this.BeginInvoke(new Action<PassportDatabaseReader.Passport>(UpdateInterface), new object[] { _passport });
            return;
        }
        else
        {
            ControlHelper.SuspendDrawing(this);
            new Thread(() => ChangeBackground(BackgroundPassport)).Start();
            lPassportNumberNo.Text = _passport.PassportNo;
            strPassportNo = _passport.PassportNo;
            lPassengerName.Text = _passport.Name.Replace(' 

Приложение представляет собой считыватель «свадебного паспорта», который показывает имя, номер комнаты гостей, номер стола, а также изображение "паспорта" на экране.

,'\n'); lPax.Text = _passport.Pax; lTableNo.Text = _passport.TableNo; lRoomNo.Text = _passport.RoomNo; pbTables.Hide(); try { pbPasspic.Load("..\\..\\Pics\\" + _passport.PassportNo + ".png"); pbPasspic.Show(); pbTables.ImageLocation = "..\\..\\Tischordnung_" + _passport.TableNo + ".png"; pbTables.Show(); } catch (Exception) { throw; } ControlHelper.ResumeDrawing(this); } }

Приложение представляет собой считыватель «свадебного паспорта», который показывает имя, номер комнаты гостей, номер стола, а также изображение "паспорта" на экране.

0
ответ дан Benjamin Blum 21 January 2019 в 16:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: