powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: DragDrop и потоки
15 сообщений из 15, страница 1 из 1
WPF: DragDrop и потоки
    #39768264
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(Что-то в подфоруме уже неделю тишина... разбужу...)


Запускаем драг:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
		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 выполняется только после отпускания мыши.
Вызов происходит в потоке пользовательского интерфейса.
Каким образом, пока идет перетаскивание, работают другие события (вроде ж как тоже в потоке пользовательского интерфейса)?
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39768296
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Вероятно поддержка из api win32.
На уровне Оси реализован сабж.
Имхо
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39768299
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Вероятно поддержка из api win32.Для драг-дропа - само собой. Но что происходит с потоком в самом WPF-е?
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39768304
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Имхо надо проставить логирование с добавкой номера потоков и поглялеть картинку лога.
Должно быть все видно. (как работают в фоне события пока тащим)
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39768310
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увижу одинаковые номера - непонятно как один и тот же поток обрабатывает одновременно разные события. Увижу разные номера - непонятно, как события интерфейса может отрабатывать не поток пользовательского интерфейса. То есть в любом случае остается вопрос. Хочешь - экпериментируй, но оставь свободное место для ответов в этом топике для тех, кто возможно знает ответ на вопрос.
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39768320
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
> оставь свободное место в топике...
Ну ты юморист)))) LOL
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39768447
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProКаким образом, пока идет перетаскивание, работают другие события (вроде ж как тоже в потоке пользовательского интерфейса)?
Перетаскивание, в общем-то, дискретно. Поскольку оно в основном реализовано на винапи, а WPF-приложения - STA, то используется стандартная модель синхронизации через оконные сообщения - просто дискретно делается PostMessage окну-владельцу, оно их обрабатывает в своем message loop. В промежутках оно обрабатывает прочие события. Частота дискретизации достаточно велика, чтобы процесс драг-дропа выглядел плавно, и в то же время не тормозил остальную обработку.
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39768459
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погоди-погоди.
message loop выполняет события по очереди. Как он может выполнять другие события, не закончив обработку OnPreviewMouseMove
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39768475
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProКак он может выполнять другие события, не закончив обработку OnPreviewMouseMove
Ну, разумеется, никак. Проверяется же легко: в хэндлер PreviewMouseMove окна вставляется Thread.Sleep тогда, когда идет процесс драг-дропа - он становится весьма тормозным и рваным (перенос происходит рывками). Я это проверял.
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39768500
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныНу, разумеется, никак.Я не понимаю, что ты хочешь сказать. Никак не может, но тем не менее обрабатывает. Вот смотри:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
		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");
		}

вывод:
Код: c#
1.
2.
3.
1:DragStarted
1:DragOver
1:Dropped

вопрос - как умудряется один и тот же поток бросить выполнение одного обработчика, чтобы обработать другой, а потом вернуться в нужную точку?
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39768529
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proброситьбросил или нет обычно видно по стеку вызова.
Тут не видно(.
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39769467
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proвопрос - как умудряется один и тот же поток бросить выполнение одного обработчика, чтобы обработать другой, а потом вернуться в нужную точку?
Ничего он не бросает. Просто из одного обработчика (OnPreviewMouseMove) вызывается другой (MenuItemBorder_OnDragOver), потом выполнение возвращается в первый обработчик. Вызов обработчика драг-дропа делается внутри DragDrop.DoDragDrop:
Код: c#
1.
2.
3.
4.
5.
6.
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.
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39769618
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь понял, спасибо )
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39772371
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
это что-то вроде await по принципу действия?
...
Рейтинг: 0 / 0
WPF: DragDrop и потоки
    #39772374
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subСон Веры Павловны,
это что-то вроде await по принципу действия?ничего общего ))
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: DragDrop и потоки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]