Почему мой код для установки текста метки иногда вызывается неправильно? - PullRequest
0 голосов
/ 09 июня 2009

У меня есть ярлык в WinForm.в приложении я создаю тему для установка свойства Text метки. поскольку код отвечает за установку свойства Text ярлык - другая тема, я написал это так:

private void SetLabel8Text(string text)
    {
        try
        {
            if (this.label8.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetLabel8Text);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.label8.Text = text;
            }
        }
        catch (Exception ex)
        {

        }

    }

Теперь я также обрабатываю событие KeyPress следующим образом:

    if (e.KeyChar.ToString() == "\r")
            {
        SetLabel8Text("Enter key Pressed !");
    }

проблема, с которой я сталкиваюсь, заключается в том, что после нажатия клавиши Enter (выполнение событие KeyPress), метод SetLabel8Text никогда не выполняется.

все остальное, кажется, течет хорошо, Я попытался пройти по коду, и он зависает в этом месте (внутри метода SetLabe8Text:

this.Invoke (d, новый объект [] {текст});

зависает и немного не двигается вперед.

Ответы [ 6 ]

4 голосов
/ 09 июня 2009

Ну, тот факт, что вы проглатываете любые исключения, выданные SetLabel8Text, затрудняет точное понимание того, что происходит. Вы должны никогда проглатывать исключения безоговорочно, по крайней мере, не регистрируя происходящее. (Вы также не должны просто ловить «Исключение». Поймать более конкретный тип исключения). Не могли бы вы опубликовать короткую, но полную программу, которая демонстрирует проблему.

Добавление регистрации в событии нажатия клавиши и SetLabel8Text также помогло бы.

1 голос
/ 10 июня 2009

Попробуйте позвонить BeginInvoke вместо Invoke.

Invoke - это блокирующий вызов, поэтому возможно, что у вас есть состояние гонки. (Invoke не вернется до тех пор, пока метод фактически не будет выполнен, но метод может быть выполнен только после того, как поток пользовательского интерфейса обработает свой цикл сообщений).

0 голосов
/ 11 июня 2009

Вы не следуете основному принципу winforms: создавать только элементы управления пользовательского интерфейса в потоке пользовательского интерфейса. Ваш обработчик события KeyPress находится в потоке пользовательского интерфейса, поэтому, если ваша метка была создана в потоке пользовательского интерфейса, вам не нужно использовать BeginInvoke / Invoke для него.

Если вы создаете формы, элементы управления и т. Д. В потоках, отличных от потока пользовательского интерфейса, вы, вероятно, делаете что-то не так.

См. http://weblogs.asp.net/justin_rogers/pages/126345.aspx для подробностей кровавых.

0 голосов
/ 10 июня 2009

Одним из возможных объяснений может быть то, что вы делаете дальше. Предполагая, что функция SetLabel8Text вызывается в другом потоке, она потребует вызова и, таким образом, будет выполнена еще раз. Однако, во второй раз, когда он выполняется (и, следовательно, не требует вызова) , он выполняется в потоке, который владеет графическим интерфейсом, обычно в основном потоке . Поэтому, если у вас есть код, блокирующий основной поток на какое-то время где-то в вашем приложении, может показаться, что функция SetLabel8Text никогда не выполняется во второй раз . Всегда выполняйте тяжелые задачи и держите основной поток в простоте.

0 голосов
/ 09 июня 2009

Попробуйте:

if (e.KeyCode == Keys.Enter) {
}
0 голосов
/ 09 июня 2009

Попробуйте следующее:

if(e.KeyChar == '\n')
    SetLabel8Text("Enter key Pressed !");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...