2013-04-19 2 views
-1

Все в моем приложении работает так, как я хочу, но я действительно не понимаю, как именно? Я настраиваю пару потоков для мониторинга некоторых ресурсов, которые время от времени потребуется приложениям. В потоках обновляется несколько ярлыков с надписью «все хорошо» или «э-э-э-э-э-э-э-э-э-э-э-э-э-э-э-э-э-э-э ...» Я устанавливаю тест InvokeRequired, чтобы убедиться, что он выполняется в потоке, который создал ярлыки, и все отлично работает.Threading In WinForm

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

Это работает, поэтому я не должен жаловаться, но я не хочу, чтобы какая-то ошибка появилась через месяц, и я действительно не понимаю.

+0

И ваш вопрос? –

+1

Не видя какого-либо кода, это невозможно ответить окончательно. Однако обновление ярлыков не займет много времени ... это, вероятно, происходит в микросекундах на вашем компьютере. –

+0

Если я набираю textbox1, то label1 и label2 обновляются, как мой курсор возвращается к месту, где я остановился? текстовое поле больше не является активным элементом управления после правильного обновления этикеток? – user1376713

ответ

0

Короткий ответ: не о чем беспокоиться.

Объяснение: Практически каждая система GUI, в том числе WinForms, является однопоточной, поэтому ничего не происходит одновременно, но также учитывайте, что большинство операций также очень быстрые (даже рисование).

Лучшее объяснение объясняет, как работает цикл сообщений GUI, но я слишком ленив, чтобы объяснить это, но я объясню, какую часть вы говорите, что не понимаете. Это последовательность событий при вводе в текстовое поле:

  1. Keypress сообщение, полученное от корневого окна (его цикл обработки сообщений)
  2. Keypress сообщение отправляется в текстовое поле из корневого окна
  3. Keypress сообщение, полученное текстовым полем. Текстовое поле обновляет свое внутреннее состояние, добавляя новый символ к своей внутренней строке Value.
  4. Текстовое поле информирует родительское окно о необходимости перекраски texbox при ближайшей возможности, поскольку его текстовое значение изменилось.
  5. В корневом окне появляется следующее сообщение: которое представляет собой запрос на выполнение метода invokation (потому что Invoke или BeginInvoke был вызван из другого потока).
  6. Окно корня выполняет этот метод вызова.
    1. В этом случае ваш код Invoke ', насколько я могу судить, просто устанавливает свойство метки Text, эта операция выполняется быстро, поскольку она просто устанавливает внутреннее состояние метки, она не вызывает ее вместо того, чтобы нарисоваться непосредственно (как на шаге 4), он маркирует метку как «недействительную» и ее необходимо перекрасить при следующей лучшей возможности (см. шаг 8).
  7. Корневая окно получает следующее сообщение: запрос на перекрасить текстовое поле
  8. окно корневая инструктирует текстовое поле перекрашивать себя
  9. окно корень получает следующее сообщение, или простаивает в ожидании следующего сообщение было получено

Так что да, там есть возможность для лаг или задержки в цикле сообщений, например, если ваш Invoke «d код занимает больше, чем несколько миллисекунд, чтобы выполнить. Если вы добавите Thread.Sleep(10*1000) в код Invoke'd, вы увидите.

+0

Спасибо! что помогает. Меня беспокоят те обновления, которые контролируют курсор, который поражает цель потоковой передачи. Пользовательский интерфейс будет получать результаты «работы», так что это произойдет мгновенно. Для усмешек я думаю, что могу попробовать обновить некоторые элементы управления пользователя и посмотреть, что произойдет. Еще раз спасибо за отзыв – user1376713