AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.10.2004, 13:02   #21  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Кстати насчёт потоков.
Как сказано в помощи методы класса Object распадаются на три ветки - методы для работы в многпоточной среде, методы для работы с тайм-аутами и методы .
Так вот методы wait и notify - относятся к многопоточности (хотя в самой аксапте я её еще ни разу не видел).
А методы setTimeout, cancelTimeout и getTimeoutTimerHandle судя по всему работают с обычными MS Windows таймерами. Т.е. дело обходится без дополнительных потоков - просто на основной поток приложения вешаются таймеры и когда они срабатывают (через стандартную очередь сообщений) этот поток активирует код нашего Object-а. А-ля Win API.
За это сообщение автора поблагодарили: Logger (3).
Старый 26.10.2004, 13:07   #22  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано mpogorelov

приведи пожалуйста пример как ты это делал
PHP код:
class Application extends xApplication
{
..........
    
// aa_dav
    
BarcodeScanner BarcodeScanner;
}

void startupPost()
{
    
WorkplaceParameters WorkplaceParameters// aa_dav
....................
  
// aa_dav
    
WorkplaceParameters WorkplaceParameters::findOrCreate();
    if ( 
WorkplaceParameters.BarcodeScannerExists == NoYes::Yes )
    {
        
BarcodeScanner = new BarcodeScannerWorkplaceParameters );
        
BarcodeScanner.proceedTimer();
    }

Код самого класса
PHP код:
public class BarcodeScanner extends Object
{
    
COM oposScanner;
}
void proceedTimer()
{
    
this.setTimeOut"checkDevice"1000 );
}
void new( WorkplaceParameters WorkplaceParameters )
{
    
int regKey;
    
#WinAPI
    
;
    
super();
    
oposScanner null;
    if ( 
WorkplaceParameters.BarcodeScannerExists == NoYes::Yes )
    {
        try
        {
            
regKey WinAPI::regOpenKey#HKEY_CLASSES_ROOT,
                                
"AxaptaOposScannerLib.AxaptaOposScanner"#KEY_READ );
            
if ( regKey )
            {
                
oposScanner = new COM"AxaptaOposScannerLib.AxaptaOposScanner" );
                
oposScanner.Open();
                if ( 
oposScanner.ErrorMsg() != "" )
                {
                    
error"Ошибка инициализации сканнера штрих-кодов: " oposScanner.ErrorMsg() );
                    
oposScanner.finalize();
                    
oposScanner null;
                }
                
// Release registry resource
                
WinAPI::closeRegistryregKey );
            }
            else
            {
                
error"Не зарегистрирован COM-объект сканнера штрих-кодов!" );
            }
        }
        catch
        {
            
// Ignore errors
            
oposScanner null;
        }
    }
}
void checkDevice()
{
    
Object o;
    
ObjectIdent oi;
    
TreeNode tnrtn;
    
TreeNodeIterator it;
    
xInfo xInfo = new xInfo();
    
int i;
    ;
    
this.proceedTimer();
    if ( 
oposScanner != null )
    {
        if ( 
oposScanner.DeviceEnabled() == false )
        {
            
// Reactivate scanner
            
oposScanner.DeviceEnabledtrue );
            
oposScanner.DataEventEnabledtrue );
            
// Proceed with attention...
            
oi infolog.parmLastActivatedForm();
            if ( 
oi )
            {
                
oi.object();
                if ( 
)
                {
                    
tn o.form();
                    
rtn xInfo.findNode"\\Forms\\" );
                    
rtn rtn.AOTfindChildtn.AOTname() );
                    
tn rtn;
                    if ( 
tn )
                    {
                        
tn tn.AOTfindChild"Methods" );
                        if ( 
tn )
                        {
                            
tn tn.AOTfindChild"ActivateBarcode" );
                            if ( 
tn )
                            {
                                try
                                {
                                    
o.ActivateBarcoderemoveLRSpacesoposScanner.ScanData() ) );
                                }
                                catch
                                { }
                            }
                        }
                    }
                }
            }
        }
    }

Кстати - возможно еще что твой объект создаётся на сервере в 3-х звеньевой архитектуре, обязательно проставь ему RunOn в Client.
Старый 26.10.2004, 21:15   #23  
mpogorelov is offline
mpogorelov
Участник
 
20 / 10 (1) +
Регистрация: 29.04.2004
спасибо за пример

сделал подобным образом
почему-то всё равно не работает
буду разбираться
Старый 27.10.2004, 11:45   #24  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Изначально опубликовано Alks
Кстати насчёт потоков.
Как сказано в помощи методы класса Object распадаются на три ветки - методы для работы в многпоточной среде, методы для работы с тайм-аутами и методы .
Так вот методы wait и notify - относятся к многопоточности (хотя в самой аксапте я её еще ни разу не видел).
wait() и notify() - банальное управление циклом выборки сообщений. никакой многопоточностью тут не пахло никогда. кроме того notify() и notifyall() реализованы одинаково байт в байт

в 3.0 появилась настоящая, хоть и малость глючная многопоточность - класс Thread. Пример есть в форме Tutorial_Thread
Старый 27.10.2004, 12:47   #25  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано mpogorelov
Цель: написание агента который висел бы в памяти и выполнял нужные действия с какой-то переодичностью
Прежде чем читать дальше и разбираться в вашем коде, можно задать вопросы?
Чем ваш подход отличается от сервера выполнения пакетов?
Чем вас не устроил стандартный сервер пакетов?
Почему вы решили вкладывать силы в свою разработку?
Старый 02.11.2004, 19:14   #26  
mpogorelov is offline
mpogorelov
Участник
 
20 / 10 (1) +
Регистрация: 29.04.2004
Цитата:
Изначально опубликовано mazzy

Прежде чем читать дальше и разбираться в вашем коде, можно задать вопросы?
Чем ваш подход отличается от сервера выполнения пакетов?
Чем вас не устроил стандартный сервер пакетов?
Почему вы решили вкладывать силы в свою разработку?
Задача стояла следующая:
Axapta должна реагировать на внешнее событие, а именно открывать нужную форму.
Реализована задача была так:
Внешнее приложение через COMConnector пишет в табличку требуемые параметры. В Axapta работает класс наследованный от Object. На метод этого класса, который читает данные из таблички и открывает форму на клиенте, подвешан таймер.

Как решить эту задачу с помощью пакетов мне не понятно.

Кстати данное решение мне не очень нравится тем, что грузится сеть(много пользователей).
Если у кого есть соображения по этому поводу, поделитесь пожалуйста.
Старый 02.11.2004, 21:27   #27  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
класс, который можно выполнять в пакетах:
Tutorial_RunbaseBatch
Tutorial_RunbaseForm
Tutorial_RunbaseReport

по поводу вашей задачи.
разберитесь как действует форма
tutorial_Sushi
tutorial_SushiWatcher

причем для вас важен метод tutorial_SushiWatcher.lookForSushiOrder()
последняя его строчка.

так вот. Суть пакетов. При запуске сервера пакетов, открывается форма, которая периодически опрашивает таблицу пакетов. И выполняет их.
Ваша задача - при наступлении события не "писать в табличку нужные параметры", а запустить пакет с нужными вам параметрами. Все остальное сделает сервер пакетов.

Вы же хотите "упростить" себе задачу. При этом скатываетесь в повторение существующего. Но даже если так.... То вам нужна форма-watcher, которая периодически просматривает вашу табличку и при наступлении события делает нужные вам действия.
Старый 03.11.2004, 11:43   #28  
mpogorelov is offline
mpogorelov
Участник
 
20 / 10 (1) +
Регистрация: 29.04.2004
Цитата:
Изначально опубликовано mazzy
класс, который можно выполнять в пакетах:
причем для вас важен метод tutorial_SushiWatcher.lookForSushiOrder()
последняя его строчка.
собственно по такому принципу и работает мой класс

Цитата:

Ваша задача - при наступлении события не "писать в табличку нужные параметры", а запустить пакет с нужными вам параметрами. Все остальное сделает сервер пакетов.
на сколько я понял, при запуске пакета минимальный интервал времени равен одной минуте
это много
можно ли задать более частую периодичность?
Старый 03.11.2004, 23:56   #29  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
можно.
посмотрите в форму, которая реализует сервер пакетов
Теги
object, thread

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: Map Object Sorting - a real issue Blog bot DAX Blogs 7 15.10.2008 12:02
axperf: Debugging X++ Object Leaks Blog bot DAX Blogs 2 07.07.2008 12:35
Axapta Lessons: Application Object Id’s Blog bot DAX Blogs 0 27.06.2007 09:30
Dynamics AX: .Net BC, C# - Working with AxaptaRecord Object Blog bot DAX Blogs 0 20.06.2007 23:13
dynamicsusers: What object belongs to what granule Blog bot DAX Blogs 0 27.05.2007 14:21

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:52.