23.03.2016, 11:08 | #41 |
Участник
|
выше я еже приводил ссылку Вывести сообщение сгенерированное в отдельном потоке (thread) в окно инфо?
|
|
23.03.2016, 11:14 | #42 |
Участник
|
vikuss2006 Странно. Должно работать. AX 2009 отрабатывает.
Про точку останова - глюк. Breakpoint в помощь... Только учтите, что основное приложение поток с таким кодом ждать не будет... Тут надо использовать waitUntilSignaled. |
|
24.03.2016, 13:30 | #43 |
Участник
|
X++: class FCH_ThreadDemo { } static client void main(Args args) { Thread thread; ; thread = new Thread(); //thread.setInputParm([...]); // Передать параметры в контейнере, если необходимо thread.removeOnComplete(true); // По завершении работы выгрузить поток thread.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run)); // Выполнение thread.waitUntilSignaled(); // Ожидаем получение ответа из потока infolog.import(thread.getOutputParm()); // Выводит в инфолог полученный выходной параметр } static client void run(Thread _thread) { container packedArgs; ; //Получение параметров, переданных в потоке //packedArgs = _thread.getInputParm(); // Выполнение метода обычными командами Axapta info('Hello'); // Последней командой метода, скопировать infolog в выходной параметр потока _thread.setOutputParm(infolog.copy(1,infolog.num())); }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
25.03.2016, 12:56 | #44 |
Участник
|
У меня Аксапта 2003 года, так что наверное, не будет работать
|
|
25.03.2016, 14:14 | #45 |
Участник
|
Попробуйте вернуться к идее vb-скрипта. Заставьте разработчиков прислать вам пример, который работает на vb-скрипте. Пусть vb-скрипт записывает результаты своей работы в текстовый файл.
Таким способом вы избежите особенностей Аксапты. И у вас будет больше козырей при общении с разработчиками этой приблуды. Даже такая сложная программа, как 1С, позволяет вызывать свои обработки через vb-скрипт. |
|
25.03.2016, 14:36 | #46 |
Участник
|
t.waitUntilSignaled() - Класс Thread не содержит эту функцию.
|
|
25.03.2016, 15:44 | #47 |
Участник
|
Тогда в родительском потоке в цикле опрашивать статус дочернего, пока не выполниться.
Метод thread.status есть? X++: thread = new Thread(); thread.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run)); while (thread.status() != 2) { sleep(500); } [result] = thread.getOutputParm(); Последний раз редактировалось S.Kuskov; 25.03.2016 в 15:46. |
|
25.03.2016, 16:43 | #48 |
Участник
|
S.Kuskov
Статус 3 (ошибка) повесит программу. X++: thread = new Thread(); thread.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run)); while (thread.status() == 1) //fixed { sleep(500); } [result] = thread.getOutputParm(); |
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
28.03.2016, 12:13 | #49 |
Участник
|
|
|
28.03.2016, 12:21 | #50 |
Участник
|
Никак не получается устранить ошибку Object 'FormRun' could not be created
|
|
29.03.2016, 16:28 | #51 |
Участник
|
|
|
30.03.2016, 08:14 | #52 |
Участник
|
Цитата:
Код остался такой же, только с примененными советами class FCH_ThreadDemo { } static client void main() { Thread t; container result; ; t = new Thread(); t.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run)); while (t.status() == 1) //fixed { sleep(500); } [result] = t.getOutputParm(); info(conpeek(result,1)); } static client void run(Thread t) { t.setOutputParm(['Hello']); } Вызов FCH_ThreadDemo::main(); |
|
30.03.2016, 08:47 | #53 |
Участник
|
Гиблое это дело, работать с потоками в 3.0. Насколько я знаю, они никогда нормально не работали. Если очень надо, лучше используйте setTimeOut на форме.
|
|
30.03.2016, 14:41 | #54 |
Участник
|
Не на форме. Предположительно, в глобальном кеше.
Нужен объект, который после инициализации и создания экземпляра Com будет существовать до закрытия Axapta. Не знаю, был ли уже в Ax3.0 \Classes\ClassFactory\globalCache()? Если был, то посмотрите по перекрестным ссылкам примеры использования. Вероятно, проще всего, будет в глобальный кеш засунуть экземпляр класса. Если экземпляр класса в глобальном кеше будет "простаивать" (в смысле, приведет к выгрузке COM из памяти по причине "не использования"), то организовать периодическое "передергивание" по setTimeOut через метод класса \Classes\Info\executeUserOptions() Хотя, конечно, это уже "костыли" от безысходности...
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
30.03.2016, 14:43 | #55 |
Участник
|
На какой команде-то эта ошибка возникает?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
30.03.2016, 15:33 | #56 |
Участник
|
|
|
30.03.2016, 16:05 | #57 |
Участник
|
Можно и в глобальном кэше, в 3.0 он есть.
|
|
30.03.2016, 17:50 | #58 |
Участник
|
X++: static client void run(Thread t) { ; // Поставьте в начале метода "пустую" точку с запятой t.setOutputParm(['Hello']); }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
Теги |
com connector, com-объект, thread |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|