У меня есть пользовательский интерфейс, который будет обращаться к 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