Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 WPF: DragDrop и потоки  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
(Что-то в подфоруме уже неделю тишина... разбужу...)


Запускаем драг:
		protected override void OnPreviewMouseMove(MouseEventArgs e)
		{
			if (e.LeftButton == MouseButtonState.Pressed)
			{
				IsDragging = true;
				DragDrop.DoDragDrop(this, this, DragDropEffects.Copy | DragDropEffects.Move);
				IsDragging = false;
			}
		}

DoDragDrop вроде как выполняется синхронно, IsDragging = false выполняется только после отпускания мыши.
Вызов происходит в потоке пользовательского интерфейса.
Каким образом, пока идет перетаскивание, работают другие события (вроде ж как тоже в потоке пользовательского интерфейса)?
1 фев 19, 15:24    [21799812]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37054
Shocker.Pro,
Вероятно поддержка из api win32.
На уровне Оси реализован сабж.
Имхо
1 фев 19, 15:59    [21799857]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Petro123
Вероятно поддержка из api win32.
Для драг-дропа - само собой. Но что происходит с потоком в самом WPF-е?
1 фев 19, 16:02    [21799861]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37054
Shocker.Pro,
Имхо надо проставить логирование с добавкой номера потоков и поглялеть картинку лога.
Должно быть все видно. (как работают в фоне события пока тащим)
1 фев 19, 16:10    [21799868]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Увижу одинаковые номера - непонятно как один и тот же поток обрабатывает одновременно разные события. Увижу разные номера - непонятно, как события интерфейса может отрабатывать не поток пользовательского интерфейса. То есть в любом случае остается вопрос. Хочешь - экпериментируй, но оставь свободное место для ответов в этом топике для тех, кто возможно знает ответ на вопрос.
1 фев 19, 16:16    [21799876]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37054
Shocker.Pro,
> оставь свободное место в топике...
Ну ты юморист)))) LOL
1 фев 19, 16:23    [21799889]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4604
Shocker.Pro
Каким образом, пока идет перетаскивание, работают другие события (вроде ж как тоже в потоке пользовательского интерфейса)?

Перетаскивание, в общем-то, дискретно. Поскольку оно в основном реализовано на винапи, а WPF-приложения - STA, то используется стандартная модель синхронизации через оконные сообщения - просто дискретно делается PostMessage окну-владельцу, оно их обрабатывает в своем message loop. В промежутках оно обрабатывает прочие события. Частота дискретизации достаточно велика, чтобы процесс драг-дропа выглядел плавно, и в то же время не тормозил остальную обработку.
1 фев 19, 18:40    [21800058]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Погоди-погоди.
message loop выполняет события по очереди. Как он может выполнять другие события, не закончив обработку OnPreviewMouseMove
1 фев 19, 19:09    [21800078]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4604
Shocker.Pro
Как он может выполнять другие события, не закончив обработку OnPreviewMouseMove

Ну, разумеется, никак. Проверяется же легко: в хэндлер PreviewMouseMove окна вставляется Thread.Sleep тогда, когда идет процесс драг-дропа - он становится весьма тормозным и рваным (перенос происходит рывками). Я это проверял.
1 фев 19, 19:37    [21800098]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Сон Веры Павловны
Ну, разумеется, никак.
Я не понимаю, что ты хочешь сказать. Никак не может, но тем не менее обрабатывает. Вот смотри:
		protected override void OnPreviewMouseMove(MouseEventArgs e)
		{
			if (e.LeftButton == MouseButtonState.Pressed)
			{
				IsDragging = true;
				System.Diagnostics.Debug.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:DragStarted");
				DragDrop.DoDragDrop(this, this, DragDropEffects.Copy | DragDropEffects.Move);
				System.Diagnostics.Debug.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Dropped");
				IsDragging = false;
			}
		}
		private void MenuItemBorder_OnDragOver(object sender, DragEventArgs e)
		{
			System.Diagnostics.Debug.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:DragOver");
		}
вывод:
1:DragStarted
1:DragOver
1:Dropped
вопрос - как умудряется один и тот же поток бросить выполнение одного обработчика, чтобы обработать другой, а потом вернуться в нужную точку?
1 фев 19, 20:38    [21800144]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37054
Shocker.Pro
бросить
бросил или нет обычно видно по стеку вызова.
Тут не видно(.
1 фев 19, 21:35    [21800179]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4604
Shocker.Pro
вопрос - как умудряется один и тот же поток бросить выполнение одного обработчика, чтобы обработать другой, а потом вернуться в нужную точку?

Ничего он не бросает. Просто из одного обработчика (OnPreviewMouseMove) вызывается другой (MenuItemBorder_OnDragOver), потом выполнение возвращается в первый обработчик. Вызов обработчика драг-дропа делается внутри DragDrop.DoDragDrop:
RoutedEventArgs args = new RoutedEventArgs(DragDropStartedEvent, dragSource);
// Raise the DragDropStarted internal event(Bubble).
if (dragSource is UIElement)
{
  ((UIElement)dragSource).RaiseEvent(args);
}
(здесь)
внутри UIElement.RaiseEvent вызывается internal static void RaiseEventImpl, где для события создается EventRoute, и для него вызываются хэндлеры - см. здесь. Далее управление передается конструкциям, следующим после вызова DragDrop.DoDragDrop.
5 фев 19, 06:18    [21801672]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
Теперь понял, спасибо )
5 фев 19, 13:06    [21801882]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
vb_sub
Member

Откуда:
Сообщений: 468
Сон Веры Павловны,
это что-то вроде await по принципу действия?
11 фев 19, 16:32    [21806618]     Ответить | Цитировать Сообщить модератору
 Re: WPF: DragDrop и потоки  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19953
vb_sub
Сон Веры Павловны,
это что-то вроде await по принципу действия?
ничего общего ))
11 фев 19, 16:34    [21806623]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить