Есть ли удобный способ контролировать порядок обработки потоков? - PullRequest
0 голосов
/ 09 января 2019

У меня есть пользовательский интерфейс, который будет обращаться к XL и создавать графики при нажатии кнопок.

Поскольку операции XL занимают некоторое время, я выполняю их в отдельном потоке для каждого вызова, поэтому программа работает без сбоев.

Я использую Synclock, чтобы новые потоки не запускали процедуру до завершения предыдущего вызова.

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

Есть ли умный способ контролировать порядок входа потоков в синхронизатор? Я могу придумать трудный путь с использованием глобального списка потоков или чего-то подобного.

Public Class Main_UI
    Private myXLapp As New XL_OPERATIONS

    Private Sub button_click( ...) handles button_click_event

        Dim new_params as New Object
        new_params =get_new_measurement_from_instruments()  '<-- gets new data on button click

        myXLapp.write_XL_plot(params)   '<-- makes XL plot without holding up the program
    End Sub
End Class

Public Class XL_OPERATIONS
    Public Sub New()
    End Sub

'********* EDITED CODE ****** EDITED CODE ****** EDITED CODE  ****** 
'*******************************************************************
'*******************************************************************

    Private static XLwr_queue as New Queue()
    Private static XLwr_thread as New Thread(Address of Send_Queued_Plots_to_XL())

    '--- adds new params to queue to be used by thread below ---- 
    '
    Property write_XL_plot()
        Set(params as Object)
            XLwr_queue.Enqueue(params)
            if XLwr_thread.ThreadState<> ThreadState.Running Then   
            XLwr_thread.start()  
        End Set
    End Property


    '---- creates XL plots in the order of params in Queue ---
    '
    Private Sub Send_Queued_Plots_to_XL()
        For i as Integer=0 to XL_queue.Count

            write_XL_plot_routine(XL_queue.Dequeue())

        Next
    End Sub

'*******************************************************************
'*******************************************************************


'********* ORIGINAL CODE ****** ORIGINAL CODE ****** ORIGINAL CODE  ****** 
'*************************************************************************
'*************************************************************************

    '----- starts a thread that writes plot to XL  ----------
    '
    Public Sub write_XL_plot(params as object)
        Dim thread as New Thread(
                    Sub() 
                        write_XL_plot_routine(params as object)
                    End Sub
                    )
        thread.start()
    End Sub

    '----- routine for making XL plot -----------------------
    '
    Private XLWRsynclock As New Object

    Private Sub write_XL_plot_routine(params As object)
        synclock XLWRsynclock 

        'makes XL plot
        'takes a long time
         End synclock 
    End Sub

'*************************************************************************
'*************************************************************************


End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...