In der Object-Pascal-Umgebung "Delphi" habe ich unter Einbindung der Liblrary usbdmx.dll das DE-Interface erfolgreich in Betrieb genommen. Die Daten von "DMX-In" lese ich dabei in einem festen Zeitraster aus. Dieses "Polling" ist allerdings ineffizient, da meistens keine Änderungen stattfinden. Um ereignisgesteuert zu reagieren, wurden in der DLL beispielsweise die Funktionen RegisterInputChangeNotification und UnregisterInputChangeNotification vorgesehen. Die Funktion RegisterInputChangeNotification beinhaltet den Parameter vom Typ THOSTINPUTCHANGEPROC. Ich vermute, das Proc der Bezeichner einer Routine im eigenen Programm ist, das aufgerufen werden soll, sobald eine Änderung der Eingabedaten erfolgte.
Leider kenne ich mich auf dieser Ebene in Delphi nicht so gut aus, um die nötigen hierfür zu erzeugen. Es wäre für mich sehr hielfreich, wenn jemand einen kurzen Ausschnitt mit den Programmzeilen zur Verfügung stellen könnte, aus denen dies ersichtlich ist.
Vielen Dank im Voraus,
av@dmx.
Ich habe weiter gesucht und getestet. Für RegisterdeviceChangeNotification und RegisterInputChangeotification habe ich eine funktionierende Lösung gefunden; sie ist wie folgt (Beispiel: RegisterInputChangeNotification):
util main:
interfaces
type
PDMXArray = ^TDMXArray;
TDMXArray = array[0..511] of byte;
TSERIAL = array[0..15] of Char;
TSERIALLIST = array[0..31] of TSERIAL;
THOSTDEVICECHANGEPROC = procedure; stdcall;
THOSTINPUTCHANGEPROC = procedure; stdcall;
THOSTINPUTCHANGEPROCBLOCK = procedure(blocknumber: byte); stdcall;
...
function RegisterInputChangeNotification(Proc: THOSTDEVICECHANGEPROC): DWORD;
stdcall external 'usbdmx.dll';
...
implementation
{$R *.dfm}
procedure InputChangeNotification;
begin
... kurze Zuweisungen
end;
procedure Form1.ScanButtonClick(Sender: TObject);
begin
...
RegisterInputChangeNotification(@InputChangeNotification)
...
end;
Möglicherweise ist dies nicht der korrekte Weg, da die äquivalente Vorgehensweise für RegisterInputChangeBlockNotificatioen zum Absturz führt:
util main;
interfaces
type
PDMXArray = ^TDMXArray;
TDMXArray = array[0..511] of byte;
TSERIAL = array[0..15] of Char;
TSERIALLIST = array[0..31] of TSERIAL;
THOSTDEVICECHANGEPROC = procedure; stdcall;
THOSTINPUTCHANGEPROC = procedure; stdcall;
THOSTINPUTCHANGEPROCBLOCK = procedure(blocknumber: byte); stdcall;
...
function RegisterInputChangeBlockNotification(Proc: THOSTINPUTCHANGEPROCBLOCK):
DWORD; stdcall external 'usbdmx.dll';
...
implementation
{$R *.dfm}
procedure InputChangeBlockNotification(Block : Byte);
begin
Edit1.Caption := IntToStr(Block);
end;
procedure Form1.ScanBlockButtonClick(Sender: TObject);
begin
...
RegisterInputChangeBlockNotification(@InputChangeBlockNotification);
...
end;
...
end.
Das Programm läuft zunächst fehlerfrei. Sobald über DMX-In eine Veränderung eintrifft, wird offenbar die Procedur InputChangeBlockNotification(Block : Byte) aufgerufen (es erscheint in label1 die Nummer des 32bit-Blocks, in dem eine Änderung erfolgte; z.B. die "1", wenn Kanal 38 sich änderte, bzw. "0" bei Kanal 5) und nach zwei bis drei Sekunden erscheint die folgende Meldung in der Entwicklungsumgebung "Im Projekt ... sind zu viele aufeinander folgende Exceptions aufgetreten". Beim Aufruf der ausführbaren Datei erfolgt nach sehr viel kürzerer Zeit ein schlichter Absturz.
Was läuft hier falsch und wie kann ich es korrigieren?
Vielen Dank im Voraus für eine Lösung,
av@dmx.