Cómo hacer que SendKeys actúe sincrónicamente en IBM Host Access Library

Yo uso elBiblioteca de clases de IBM Host Access para la automatización COM como una forma de comunicarse con un IBM AS400 (también conocido como iSeries, IBM i, pantalla verde, 5250) a través de un emulador de terminal. Noto que cuando emite una instrucción "SendKeys", el control vuelve a su aplicación antes de que el emulador de IBM termine con el comando. Esto puede ocasionar problemas de temporización porque puede enviar otra instrucción "SendKeys" antes de que el sistema esté listo para aceptarla.

Por ejemplo:

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

funcionaría correctamente al recorrer el código en un depurador, pero fallará cuando se ejecute normalmente porque la segunda instrucción se envió demasiado pronto.

Una forma de trabajar con esto es poner un temporizador o bucle después de cada comando para ralentizar el programa de llamada. Considero que esto es menos que ideal porque el período de tiempo no siempre es predecible, a menudo esperará más de lo necesario para acomodar un hipo ocasional. Esto ralentiza el tiempo de ejecución de todo el proceso.

Otra forma de evitar esto es esperar hasta que haya una condición comprobable en la pantalla como resultado de su comando enviado. Esto funcionará a veces, pero algunos comandos no provocan que se pruebe un cambio de pantalla y si está buscando abstraer su comando llamando a una clase o subrutina, tendrá que pasar en qué condición de pantalla debe estar atento.

Lo que me gustaría encontrar es uno de los métodos de "espera" que funcionará en el caso general. Parece que opciones como la clase autECLScreenDesc tienen que adaptarse a condiciones muy específicas.

La clase autECLPS (también conocida como AutPS) tiene varios métodos de espera(Wait, WaitForCursor, WaitWhileCursor, WaitForString, WaitWhileString, WaitForStringInRect, WaitWhileStringInRect, WaitForAttrib, WaitWhileAttrib, WaitForScreen, WaitWhileScreen) pero también parecen estar esperando condiciones específicas y no funcionan para el caso general. El caso general es importante para mí porque en realidad estoy tratando de escribir una subrutina de actualización de campo de propósito general que se pueda llamar desde muchos lugares dentro y fuera de mi .dll.

Este ejemplo está escrito en VB.NET, pero esperaría el mismo comportamiento de C #, C ++, VB6, Java; realmente cualquier cosa que use IBMPersonal Communications para Windows, Biblioteca de clase de acceso de host de la versión 6.0.

Respuestas a la pregunta(1)

Su respuesta a la pregunta