Лучше иметь энергозависимый флаг completed
в вашем Task
и установить true
, как только вся логика будет выполнена.
class Task implements Callable<Boolean>{
private volatile boolean completed = false;
@Override
public Boolean call() throws Exception {
//task code
completed = true;
}
public boolean isCompleted(){
return this.completed;
}
}
Методы executor.isTerminated(
) и executor.isShutdown()
всегда возвращают false
, поскольку вы не выключили исполнителя и не могут использоваться для проверки состояния отдельных задач. Эти методы сообщат вам состояние исполнителя.
Вы не должны генерировать новые маркировки написанием кода, которое создает средства управления.
Необходимо использовать.Add метод на наборе Средств управления для создания новых маркировок.
Например:
UserForm1.Controls.Add("Forms.Label.1", "foo", True)
Можно использовать WithEvents
получить события.
Например, в UserForm1,
Public WithEvents a As MSForms.Label
Private Sub a_Click()
MsgBox "label clicked"
End Sub
Private Sub CommandButton1_Click()
Set a = UserForm1.Controls.Add("Forms.Label.1", "foo", True)
a.Visible = True
a.Caption = "Hi There"
End Sub
Если Вы захотите сделать динамический массив из недавно добавленных средств управления, то необходимо будет создать немного класса обертки. Пример кода для этого здесь.
Вы смогли к обходному решению эта версия McAfee. Но следующая версия файлов данных или другой вредоносный блокировщик могла бы заблокировать Вас во всяком случае.
Таким образом, можно создать код как это для работы Вас машина разработки, но это никогда не будет (или только временный) работа при распределении клиентам.
Если возможный я рекомендовал бы против динамического поколения кода (запахи как программа самоизменения?).
Возможно, трудно сказать, не зная Вашей определенной проблемы, но я держал пари, что существует лучшее решение с помощью функции с необходимыми параметрами.