Я делаю приложение WinForms в .net 4.0 (vb.net), и я хотел бы спросить:Многопоточность & Thread.Sleep замораживает графический интерфейс
Я пишу кусок кода, который должен выполняться каждый конкретный интервал , Эта задача сначала отключит кнопку в форме, а затем выполнит эту работу. В 2-х очках во время этой работы он должен ждать 1 сек, а затем продолжить. По завершении он должен снова включить кнопку.
Во время всей этой процедуры я не хочу замораживать gui.
Как я должен выполнить это? Должен ли я использовать фона рабочего?
Не стесняйтесь отвечать мне на C# или vb.net, что угодно!
Заранее благодарен!
EDIT: Что я сделал до сих пор (я использую AForge.NET рамку для захвата экрана камеры):
Я перетащил работник в фоновой форме. В своем DoWork случае, я записалась основной работа:
Private Sub BackgroundWorker_camera_DoWork() Handles BackgroundWorker_camera.DoWork
do_evaluation()
End Sub
do_evaluation юг должен делать какую-то работу, а затем ждать для второго (для камеры устройства, чтобы быть готовыми), захват камеры снимки, ждать другого вторая и закончить работу:
Public Delegate Sub do_evaluationDelegate()
Public Sub do_evaluation()
If Me.InvokeRequired Then
Me.Invoke(New do_evaluationDelegate(AddressOf do_evaluation))
Return
End If
ButtonX_Evaluate.Enabled = False
ButtonX_restore.Enabled = False
...some work...
evaluate_from_camera()
...some work...
Main.ButtonX_Evaluate.Enabled = True
Main.ButtonX_restore.Enabled = True
ReleaseMemory()
End Sub
и оценить из подразделов камеры:
Public Delegate Sub evaluate_from_cameraDelegate()
Public Sub evaluate_from_camera()
If Me.InvokeRequired Then
Me.Invoke(New evaluate_from_cameraDelegate(AddressOf evaluate_from_camera))
Return
End If
Aforge_cam.start_source()
'wait for 1sec
Thread.Sleep(1000)
AddHandler Aforge_cam.videoSource.NewFrame, AddressOf Aforge_cam.video_NewFrame
'wait for 1sec
Thread.Sleep(1000)
Aforge_cam.CloseVideoSource()
End Sub
Поскольку система требует немного времени для подключения к аппаратному кулачку к югу должен ждать для с cond после команды Aforge_cam.start_source()
, чтобы оборудование полностью инициализировалось.
Затем добавление обработчика для нового события захвата кадра при оценке _from_camera приведет к захвату нового кадра в общедоступной переменной «screenshot». Поскольку для захвата кадра из веб-камеры требуется несколько десятых доли секунды, код должен дождаться захвата растрового изображения в переменной скриншота, чтобы продолжить. Следовательно, 2 команды сна.
Я начинаю процесс командой RunWorkerAsync
фоновому работнику. Тем не менее, GUI зависает, и я не могу понять, почему, поскольку фоновые работники работают на отдельном потоке, правильно?
Покажите нам, что вы пробовали до сих пор. Трудно ответить как недостаток информации от вас. Будет работать рабочий фон, а также новый поток, но оба они разные, в зависимости от того, что вы хотите ... – Codexer