Показать сообщение отдельно
Старый 23.12.2014, 14:46   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Схема работы с потоками описана здесь

Ошибка времени выполнения в 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() нужным количеством значений.

Т.е. на этапе отладки класса можешь работать "как обычно", а когда класс будет готов и отлажен, "обернуть" его вызов в отдельный поток.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...