AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Event für Funktion in einer "fremden" DLL
Thema durchsuchen
Ansicht
Themen-Optionen

Event für Funktion in einer "fremden" DLL

Ein Thema von hirnstroem · begonnen am 25. Feb 2008 · letzter Beitrag vom 26. Feb 2008
Antwort Antwort
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#1

Event für Funktion in einer "fremden" DLL

  Alt 25. Feb 2008, 13:20
'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
Angehängte Dateien
Dateityp: pas ucanusb_556.pas (6,7 KB, 11x aufgerufen)
inde deus abest
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Event für Funktion in einer "fremden" DLL

  Alt 25. Feb 2008, 13:28
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Event für Funktion in einer "fremden" DLL

  Alt 25. Feb 2008, 13:32
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.
inde deus abest
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Event für Funktion in einer "fremden" DLL

  Alt 25. Feb 2008, 13:37
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Event für Funktion in einer "fremden" DLL

  Alt 26. Feb 2008, 07:33
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:

procedure OnReceiveMessage(var MsgBuf: CANMsg); Dann eine Funtion, mit welcher ich der Treiber DLL angeben kann, welche Methode in meinem Programm sie aufrufen solle:

  function canusb_setReceiveCallBack(h: DWord; LPFNDLL_RECEIVE_CALLBACK: Pointer) : CANUSB_Result; stdcall ; External 'canusbdrv.dllname 'canusb_setReceiveCallBack'; 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 -.-
inde deus abest
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Event für Funktion in einer "fremden" DLL

  Alt 26. Feb 2008, 07:45
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#7

Re: Event für Funktion in einer "fremden" DLL

  Alt 26. Feb 2008, 08:10
[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.dllname '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;
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Event für Funktion in einer "fremden" DLL

  Alt 26. Feb 2008, 08:19
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
inde deus abest
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz