|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
(Что-то в подфоруме уже неделю тишина... разбужу...) Запускаем драг: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
DoDragDrop вроде как выполняется синхронно, IsDragging = false выполняется только после отпускания мыши. Вызов происходит в потоке пользовательского интерфейса. Каким образом, пока идет перетаскивание, работают другие события (вроде ж как тоже в потоке пользовательского интерфейса)? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 15:24 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Shocker.Pro, Вероятно поддержка из api win32. На уровне Оси реализован сабж. Имхо ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 15:59 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Petro123Вероятно поддержка из api win32.Для драг-дропа - само собой. Но что происходит с потоком в самом WPF-е? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 16:02 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Shocker.Pro, Имхо надо проставить логирование с добавкой номера потоков и поглялеть картинку лога. Должно быть все видно. (как работают в фоне события пока тащим) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 16:10 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Увижу одинаковые номера - непонятно как один и тот же поток обрабатывает одновременно разные события. Увижу разные номера - непонятно, как события интерфейса может отрабатывать не поток пользовательского интерфейса. То есть в любом случае остается вопрос. Хочешь - экпериментируй, но оставь свободное место для ответов в этом топике для тех, кто возможно знает ответ на вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 16:16 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Shocker.Pro, > оставь свободное место в топике... Ну ты юморист)))) LOL ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 16:23 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Shocker.ProКаким образом, пока идет перетаскивание, работают другие события (вроде ж как тоже в потоке пользовательского интерфейса)? Перетаскивание, в общем-то, дискретно. Поскольку оно в основном реализовано на винапи, а WPF-приложения - STA, то используется стандартная модель синхронизации через оконные сообщения - просто дискретно делается PostMessage окну-владельцу, оно их обрабатывает в своем message loop. В промежутках оно обрабатывает прочие события. Частота дискретизации достаточно велика, чтобы процесс драг-дропа выглядел плавно, и в то же время не тормозил остальную обработку. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 18:40 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Погоди-погоди. message loop выполняет события по очереди. Как он может выполнять другие события, не закончив обработку OnPreviewMouseMove ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 19:09 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Shocker.ProКак он может выполнять другие события, не закончив обработку OnPreviewMouseMove Ну, разумеется, никак. Проверяется же легко: в хэндлер PreviewMouseMove окна вставляется Thread.Sleep тогда, когда идет процесс драг-дропа - он становится весьма тормозным и рваным (перенос происходит рывками). Я это проверял. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 19:37 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныНу, разумеется, никак.Я не понимаю, что ты хочешь сказать. Никак не может, но тем не менее обрабатывает. Вот смотри: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
вывод: Код: c# 1. 2. 3.
вопрос - как умудряется один и тот же поток бросить выполнение одного обработчика, чтобы обработать другой, а потом вернуться в нужную точку? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 20:38 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Shocker.Proброситьбросил или нет обычно видно по стеку вызова. Тут не видно(. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2019, 21:35 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Shocker.Proвопрос - как умудряется один и тот же поток бросить выполнение одного обработчика, чтобы обработать другой, а потом вернуться в нужную точку? Ничего он не бросает. Просто из одного обработчика (OnPreviewMouseMove) вызывается другой (MenuItemBorder_OnDragOver), потом выполнение возвращается в первый обработчик. Вызов обработчика драг-дропа делается внутри DragDrop.DoDragDrop: Код: c# 1. 2. 3. 4. 5. 6.
( здесь ) внутри UIElement.RaiseEvent вызывается internal static void RaiseEventImpl, где для события создается EventRoute, и для него вызываются хэндлеры - см. здесь . Далее управление передается конструкциям, следующим после вызова DragDrop.DoDragDrop. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 06:18 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Теперь понял, спасибо ) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 13:06 |
|
WPF: DragDrop и потоки
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, это что-то вроде await по принципу действия? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2019, 16:32 |
|
|
start [/forum/topic.php?fid=21&msg=39772374&tid=1440354]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 270ms |
total: | 400ms |
0 / 0 |