![]() |
Event für Funktion in einer "fremden" DLL
Liste der Anhänge anzeigen (Anzahl: 1)
'loha Folks,
im Anhang befindet sich eine Unit, mit welcher die Verbindung zu einem CAN-USB Adapter hergestellt wird (read / write / open / close etc.). Nun muss ich, um empfangene Daten einlesen zu können, Polling betreiben, wobei es mir aber lieber wäre, ein Ereignis implementieren zu können. Wie sich ein solches Ereignis implementieren lässt, ist mir allerdings nicht klar, helfende Worte nehme ich also gerne entgegen -.- Grüsse hirnstroem |
Re: Event für Funktion in einer "fremden" DLL
Wenn du nur diese Funktionen hast, dann kommst du um Polling nicht herum.
Du kannst aber das pollen in einen Thread auslagern (oder/und mindestens in einen Timer) und dann eine MEssage senden oder gleich auch das Lesen und Schreiben im Thread machen. |
Re: Event für Funktion in einer "fremden" DLL
Dann bleibt alles beim Alten. Momentan liest ein Thread die Daten ein, was in gewissen Situationen dazu führt, dass die CPU Auslastung doch sehr hoch ist. Ein "normaler" Timer mit einer Millisekunde als kleinstem Interval, wäre ohnehin zu langsam um mir 5'000 Pakete pro Sekunde vernünftig einzulesen. Dem Thread muss ich in diesem Falle auch mitteilen, dass er halt nie schlafen solle und daher schien mir ein Ereignis etwas recht vernünftiges. Wie auch immer, der Hersteller des Gerätes verspricht schon lange, Callbackfunktionen im Treiber zur Verfügung zu stellen, vielleicht wirds dann besser.
|
Re: Event für Funktion in einer "fremden" DLL
Ein Timer hat (ich glaube Systemabhängig) ein Mindestintervall, auf das er automatisch gesetzt wird. Du hast also nie eine Miilisekunde.
Aber bei soviel Daten....? Wo willst du da noch Zeit herausholen. Du könntest vielleicht nach einem erfolglosen Leseversuch in dem Thread mal ein kleines Sleep einlegen. |
Re: Event für Funktion in einer "fremden" DLL
Wird auch so gemacht. Wenn eine Weile lang (500 ms) nichts empfangen wird, geht der Thread in einen langsamen Modus, schläft also mehr oder weniger nur und wacht dann auf, wenn wieder viele Daten kommen.
Allerdings habe ich gerade gesehen, dass bereits ein neuer Treiber, welchem man beibringen kann, eine bestimmte Funktion im Programm aufzurufen. Allerdings verstehe ich noch nicht ganz wie man diese benutzt, deshalb hier ein Paar Zeilen Beschreibung: int setReceiveCallBack( CANHANDLE h, LPFNDLL_RECEIVE_CALLBACK cbfn ) With this method one can define a function that will receive all incoming messages. Note that canusb_Read will not work after this call. You can make it work again by calling this method and set cbfn equal to NULL. The callback function should be defined as void fn( CANMsg *pMsg ); Note: that the channel has to be open to be able to set a callback function. --- Ich definiere nun also eine Methode, welcher ein Pointer auf CANMsg übergeben werden kann:
Delphi-Quellcode:
Dann eine Funtion, mit welcher ich der Treiber DLL angeben kann, welche Methode in meinem Programm sie aufrufen solle:
procedure OnReceiveMessage(var MsgBuf: CANMsg);
Delphi-Quellcode:
Hier bin ich mir schon nicht mehr sicher, ob dieses LPFNDLL_RECEIVE_CALLBACK nun ein Pointer oder was auch immer sein soll, werde es wohl oder übel noch irgendwie herausfinden müssen...ausser es sagt jemand, dass das ganz einfach sei und mir sogar noch ein Paar Tipps liefert -.-
function canusb_setReceiveCallBack(h: DWord; LPFNDLL_RECEIVE_CALLBACK: Pointer) : CANUSB_Result; stdcall ; External 'canusbdrv.dll' name 'canusb_setReceiveCallBack';
|
Re: Event für Funktion in einer "fremden" DLL
Das wäre exakt mein erster Ansatz. Probiers doch einfach.
Aufruf wäre dann: canusb_setReceiveCallBack(USBhandle,@onRecieveMess age) Allerdings ist zu vermuten, dass die procedure onRecieveMessage auch mit stdcall deklariert werden muss. |
Re: Event für Funktion in einer "fremden" DLL
[quote="hirnstroem"]
int setReceiveCallBack( CANHANDLE h, LPFNDLL_RECEIVE_CALLBACK cbfn ) void fn( CANMsg *pMsg );
Delphi-Quellcode:
type TCallBackEvent : procedure(var MsgBuf: CANMsg); var Callback : TCallBackEvent; function canusb_setReceiveCallBack(h: DWord; LPFNDLL_RECEIVE_CALLBACK: TCallBackEvent) : CANUSB_Result; stdcall ; External 'canusbdrv.dll' name 'canusb_setReceiveCallBack'; procedure OnReceiveMessage(var MsgBuf: CANMsg); Begin //Do something end; Procedure TMyprogram.INIT; Begin Callback := OnReceiveMessage; canusb_setReceiveCallBack(h,Callback); // @OnReceivemessage geht vermutlich auch, aber // ich hab sowas immer über Proceduraletypen gemacht. end; |
Re: Event für Funktion in einer "fremden" DLL
LOL, schon der erste Versuch hat geklappt, aber es ist schon angenehmer, noch zustimmende Worte zu lesen, wenn man so etwas zum Ersten mal macht.
Vielen Dank für eure Hilfe! Grüsse hirnstroem |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz