У меня есть приложение winforms, и порой основной поток чрезвычайно занят. Когда основной поток занят, я хочу, чтобы пользователь мог перетащить основную форму (используя элемент управления pbAppHeader в верхней части формы), чтобы они могли переместить основную форму на экране. Поскольку основная нить чрезвычайно занята время от времени, перемещение основной формы происходит очень медленно и отрывисто.Перетащите основную форму, чтобы переместить ее на экран, на другую тему или на рабочий стол
Как я могу использовать следующие субтитры в другом потоке или фоном, чтобы перемещение основной формы было гладким? Или есть лучший способ сделать это?
Dim drag As Boolean
Dim mousex As Integer
Dim mousey As Integer
Private Sub pbAppHeader_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbAppHeader.MouseDown
drag = True 'Sets the variable drag to true.
mousex = Windows.Forms.Cursor.Position.X - Me.Left 'Sets variable mousex
mousey = Windows.Forms.Cursor.Position.Y - Me.Top 'Sets variable mousey
End Sub
Private Sub pbAppHeader_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbAppHeader.MouseMove
'If drag is set to true then move the form accordingly.
If drag Then
Me.Top = Windows.Forms.Cursor.Position.Y - mousey
Me.Left = Windows.Forms.Cursor.Position.X - mousex
End If
End Sub
Private Sub pbAppHeader_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbAppHeader.MouseUp
drag = False 'Sets drag to false, so the form does not move according to the code in MouseMove
End Sub
Вы собираетесь об этом в обратном направлении: сделать длительные интенсивные задачи на фоне рабочего, чтобы оставить пользовательский интерфейс нитку отзывчивый – Plutonix
Да, это была моя первая мысль, но дело в том, что это приложение делает только одну задачу. .. и он либо выполняет одну задачу, либо полностью бездействует. Поэтому я мог бы перемещать ВСЕ в другую нить (что было бы чрезвычайно сложно) или найти способ переместить вышеперечисленные субмастеры в другой поток. – Dan
Вы абсолютно * не можете * просто пойти не так. Существует только один поток пользовательского интерфейса, и все события пользовательского интерфейса должны запускаться в этом потоке. Вы не можете выполнять пользовательский интерфейс в фоновом потоке. И блокировка вашего * основного потока пользовательского интерфейса при выполнении некоторой вычислительно-интенсивной задачи - это ужасная идея, даже если вы найдете способ ее взломать (как вы, по-видимому, есть). Операционная система решит, что ваше приложение перестало отвечать на запросы, поскольку оно не отвечает на сообщения пользовательского интерфейса. Здесь очень нужна редизайн. Сделайте так, как предложил Плутоникс, и переместите долговременную задачу в BackgroundWorker. –