Схема работы с потоками описана здесь
Ошибка времени выполнения в ComExcelDocument_RU.findRange()
А практически, получается нечто вроде такого дополнения к твоему классу
X++:
// Обработка параметров, переданных через пункт меню
public Boolean initArgs(Args args)
{
Boolean ret = true;
;
if (! args || ! args.record() || args.dataset() != tablenum(MyTable))
{
global::error('Не указан или указан не корректный буфер таблицы-источника');
}
else
{
myTable = args.record();
}
return ret;
}
// Статический метод, вызываемый в отдельном потоке
static void runReport(Thread _thread)
{
container packedArgs;
MyClassReport report;
Args args = new Args();
packedArgs = _thread.getInputParm();
args.setupArgs('', conpeek(packedArgs, 1), conpeek(packedArgs, 2));
args.record(conpeek(packedArgs, 3));
report = new MyClassReport();
report.initArgs(args); // Передача Args из метода main
report.run();
_thread.setOutputParm(infolog.copy(1,infolog.num()));
}
public static void main(Args args)
{
Thread thread;
MyClassReport report;
;
report = new MyClassReport();
if (report.initArgs(args))
{
if (report.prompt())
{
// report.run();
// Организация отдельного потока. Можно оформить как еще один статический метод класса
thread = new Thread();
thread.setInputParm([args.parmEnumType(),
args.parmEnum(),
args.record()]);
thread.removeOnComplete(true);
thread.run(classnum(MyClassReport), staticmethodstr(MyClassReport, runReport));
thread.waitUntilSignaled();
infolog.import(thread.getOutputParm());
}
}
}
Тут есть некоторая проблема в передаче параметров, введенных пользователем. Ведь в методе runReport() экземпляр класса создается заново. Решить эту проблему можно двумя способами:
1. Использовать методы pack/unpack для передачи переменных, указанных пользователем
2. Дополнить контейнер, передаваемый через thread.setInputParm() нужным количеством значений.
Т.е. на этапе отладки класса можешь работать "как обычно", а когда класс будет готов и отлажен, "обернуть" его вызов в отдельный поток.