Является ли Application.DoEvents () формой многозадачности? - PullRequest
0 голосов
/ 20 октября 2019

Я почти уверен, Applicataion.DoEvents () в Windows Forms. это очень ранняя, очень примитивная форма многозадачности только для WindowsForms. Он имеет все контрольные сигналы и механику:

  • Приостановка выполнения вызывающего события.
  • Превращение оставшегося события в продолжение, которое будет запущено позже.
  • Разрешение запуска других событий / процессов. Просто с некоторыми дополнительными проблемами, потому что MT реализован через EventQueue. Возможно, даже рекурсивный вызов в очередь.

Но я только что натолкнулся на человека, который настаивает , что "не имеет ничего общего с многозадачностью", что я не могу смириться с моим пониманиемфункции или многозадачности.

Примечание: Я явно рассматриваю Mutlti threading только реализацию для Multi tasking . Понятно, что DoEvents() не является формой многопоточности , поскольку все мы знаем , насколько плохо это работает в средах с графическим интерфейсом .

Ответы [ 3 ]

2 голосов
/ 20 октября 2019

Я почти уверен, что это очень ранняя, очень примитивная форма многозадачности только для Windows Forms

Вы довольно близки к корректировке по всем пунктам, кроме вашей гипотезы, что этотолько для WinForms. «DoEvents» предшествует WinForms;он присутствовал в Visual Basic задолго до того, как был изобретен WinForms, и «качать очередь сообщений» явно предшествует VB. И это была плохая идея, и ее тоже легко злоупотребляли.

Превращение оставшегося события в продолжение, которое будет запущено позже.

DoEvents на самом деле ничего не делаетв продолжение, как говорят, await делает. Любое событие, которое в данный момент находится «в полете» при вызове DoEvents, имеет свое состояние в стеке, и в этом случае стек является реализацией продолжения. Это еще один аргумент против DoEvents - в отличие от await, он съедает стек и, следовательно, может способствовать переполнению.

Я только что наткнулся на плакат, который настаивает, что «не имеет ничего общего с многозадачностью». ».

Вы должны попросить автора дать разъяснения, поскольку это, безусловно, звучит неправильно.

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

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

https://referencesource.microsoft.com/system.windows.forms/R/0880978c39425ff1.html

Реальная многозадачность - это многопроцессорная обработка и многопоточность. Требуется процессор, поддерживающий многозадачность. Без такого ЦП псевдо-многозадачность сначала основывается на аппаратных прерываниях, а затем - на программном управлении процессами, а затем на диспетчеризации системных событий. Но это не настоящая многозадачность.

Многопоточность внутри процесса. Многопроцессорность для процессуса. Они оба многозадачны. Процесс - это запущенное приложение, которое может иметь несколько потоков. Многозадачность - это способность процессора выполнять несколько инструкций одновременно. Например, Windows 10 на современных Intel поддерживает как многопроцессорную, так и многопоточную обработку. DoEvents не имеет ничего общего с этими вещами: это связано с шаблоном управления событиями, чтобы иметь отзывчивый графический интерфейс. Этот шаблон был создан ранее, когда не было многозадачного процессора. Первые многозадачные процессоры были многопроцессорными, но это дорого и сложно для программирования. Таким образом, концепция ядра была создана, чтобы иметь хороший компромисс.

https://en.wikipedia.org/wiki/Computer_multitasking

https://whatis.techtarget.com/definition/true-multitasking

https://unboxingtreatment.com/2017/09/quickbite-cpu-multitasking.html

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

Ну, это называется Preemptive Multitasking, что означает «прерывание задачи». Вы делаете несколько задач, но никогда не выполняете две одновременно. Речь идет не об использовании нескольких ядер процессора, а о способе управления несколькими действиями внутри вашей программы. Общий пример - дать программе возможность обрабатывать движения мыши пользователем, выполняя длительную операцию, выполняя что-то, что можно считать «пакетной» работой.

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

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

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

...