Как заставить SendKeys действовать синхронно в IBM Host Access Library

Я используюБиблиотека классов IBM Host Access для автоматизации COM как способ связи с IBM AS400 (он же iSeries, IBM i, зеленый экран, 5250) через эмулятор терминала. Я замечаю, что когда вы запускаете инструкцию «SendKeys», управление возвращается в ваше приложение до того, как эмулятор IBM завершит работу с командой. Это может привести к проблемам с синхронизацией, поскольку вы можете отправить еще одну инструкцию «SendKeys», прежде чем система будет готова ее принять.

Например:

Imports AutPSTypeLibrary
Imports AutConnListTypeLibrary
Imports AutSessTypeLibrary

Sub Example
    Dim connections As New AutConnList
    connections.Refresh()
    If connections.Count < 1 Then Throw New InvalidOperationException("No AS400 screen can currently be found.")
    Dim connection As IAutConnInfo = DirectCast(connections(1), IAutConnInfo)

    _Session = New AutSess2
    _Session.SetConnectionByHandle(connection.Handle)
    Dim _Presentation As AutPS = DirectCast(_Session.autECLPS, AutPS)
    _Presentation.SendKeys("PM70[enter]", 22, 8)
    _Presentation.SendKeys("ND71221AD[enter]", 22, 20)

End Sub

будет работать правильно при пошаговом прохождении кода в отладчике, но не будет работать нормально, потому что вторая инструкция была отправлена ​​слишком рано.

Одним из способов работы с этим является установка таймера или цикла после каждой команды для замедления вызывающей программы. Я считаю это менее чем идеальным, потому что продолжительность не всегда предсказуема, вы часто будете ждать дольше, чем необходимо, чтобы учесть случайный сбой. Это замедляет время выполнения всего процесса.

Еще один способ обойти эту проблему - подождать, пока на экране не появится тестируемое условие в результате отправленной вами команды. Иногда это будет работать, но некоторые команды не приводят к тестированию изменения экрана, и если вы хотите абстрагировать вызов своей команды в класс или подпрограмму, вам придется указать, какое состояние экрана нужно отслеживать.

Я хотел бы найти один из методов «ожидания», который будет работать в общем случае. Такие параметры, как класс autECLScreenDesc, похоже, должны быть адаптированы к очень конкретным условиям.

В классе autECLPS (он же AutPS) есть несколько методов Wait(Wait, WaitForCursor, WaitWhileCursor, WaitForString, WaitWhileString, WaitForStringInRect, WaitWhileStringInRect, WaitForAttrib, WaitWhileAttrib, WaitForScreen, WaitWhileScreen) но они также, кажется, ожидают определенных условий и не работают для общего случая. В общем случае это важно для меня, потому что я на самом деле пытаюсь написать подпрограмму обновления полей общего назначения, которая может быть вызвана из многих мест внутри и за пределами моей .dll.

Этот пример написан на VB.NET, но я ожидаю того же поведения от C #, C ++, VB6, Java; на самом деле все, что использует IBMПерсональные коммуникации для Windows, версия 6.0 Host Class Class Library.

Ответы на вопрос(1)

Ваш ответ на вопрос