Hallo Gerd,
Zitat:
Zitat von Gerd.Schmitz
Ein kleiner Nachteil hat sich jedoch dadurch eingestellt:
Um einen automatischen Import (Lager Barcode-Buchungen) aus eine Fremdsystem durchzuführen, hatten wir im OA eine Schleifenfunktion programmiert, die nach Ablauf (Alle 5 Minuten) nachsieht ob eine Neue Importdatei vorliegt.
MUSIC (25000,20000) ! (Frequenz,Dauer)
Auch ein hochsetzten der Dauer bringt nichts. Der Import startet sofort wieder ohne die 5 Minuten zu warten.
|
Irgendsowas in der Art habe ich befürchtet.
Also ich erklär mal die Problematik, viell. fällt euch was ein: Mit dem jetzigen Patch ist die Delayzeit, die er sich errechnet eigentlich immer 1, dh. solche Verzögerungsschleifen wie bei MUSIC gehen nimmer.
Ich habe auch dieses Problem mal etwas genauer unter die Lupe genommen:
Mit der bisherigen PAUSE+Enter Methode war das Ganze auch schon ein bisserl so wie Russisches Roulette: Wenn mans ganz schnell drückt ist der Wert der Delayschleife relativ klein, MUSIC wartet kürzer. Lässt man sich mit Pause+Enter Zeit rennt die Schleife länger und MUSIC wartet dementsprechend auch länger. Selbst wenn man auf PAUSE+ENTER verzichtet erhält man tw. unterschiedliche Werte je nachdem, wie der Task Scheduler des Multitasking-Betriebssystems arbeitet. Bekommt der Prozess mal nicht die volle Rechenleistung ist eventuell die Abbruchbedingung mit 2 erfüllt und der Wert entspreicht jenem zum Zeitpunkt des Abbruchs.
Ist euch viell. auch schon aufgefallen, ohne PAUSE+Enter wartet OA4 beim Start auch unterschiedlich lang.
Insofern lässt sich für ein Multitasking-System kein wirklich "korrekter", eindeutiger Wert ermitteln.
Ich bin nun also auf Ideensuche, wie man das Problem am Besten umschiffen kann. Eine Idee wäre, dass man von einem alten PC den Wert ermittelt und dann auf die CPU-Geschwindigkeit hochrechnet, bräuchte man aber irgendeine Formel dafür. Man könnte theoretisch auch nen Wert hardcodieren aber das ist dann auch keine saubere Lösung. Hat irgendwer ne Idee wie man das Ganze "sauber" lösen könnte? Bin für Vorschläge offen.
Was Du einstweilen als Workaround machen kannst:
Bei mir lag der Delaywert so grob gepeilt um die 700h. Dh. du kannst den Initialisierungswert des Resultatregisters BX einfach von 1 auf 700 ändern. Dazu musst Du nur folgenden zusätzlichen Patch mit Deinem Hexeditor machen:
Suche nach
Code:
BB 01 00 32 E4 CD 1A 52
Wie man sieht entspricht das dem Anfangscode der Routine. Wie man oben im Disassemblierten Code sehen kann befüllt er am Anfang die Variable mit dem Wert 1. So, und wir ändern das nun auf den Wert der Deinem System entspricht.
Dazu patcht Du die Bytes
aus oben genannter Sequenz auf Deinen Initialisierungswert (bei mir also 700h)
Achtung: Wir sind auf einer Intel-CPU, also ist das Little Endian (also quasi "vertauscht")!
Wenn Du auf 701h patchen willst ändere einfach 00 auf 07 und fertig.
Alles unklar?