2014-10-27 2 views
-1

Я делаю приложение 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 зависает, и я не могу понять, почему, поскольку фоновые работники работают на отдельном потоке, правильно?

+2

Покажите нам, что вы пробовали до сих пор. Трудно ответить как недостаток информации от вас. Будет работать рабочий фон, а также новый поток, но оба они разные, в зависимости от того, что вы хотите ... – Codexer

ответ

0

Для того, чтобы выполнить операции, вам необходимо использовать Timer, используя Thread.Sleep в потоке пользовательского интерфейса, чтобы заморозить GUI и не предназначено для таких задач.

Только choose the one, который подходит вам лучше всего.

Смежные вопросы