AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

problem mit DLL und threads

Ein Thema von milchbrötchen · begonnen am 9. Aug 2012 · letzter Beitrag vom 10. Aug 2012
Antwort Antwort
Seite 1 von 2  1 2   
milchbrötchen

Registriert seit: 3. Apr 2007
Ort: Konstanz
36 Beiträge
 
#1

problem mit DLL und threads

  Alt 9. Aug 2012, 20:16
guten abend,
ich frage mit hilfe einer DLL daten aus einem sensor ab. 500 mal pro sekunde. läuft wunderbar. wenn ich dann mit zwei threads zwei sensoren parallel abfrage kommt es anscheinend zu konflikten weil die sensoren dann verrückte werte zurückliefern. ich habe schon versucht nacheinander abzufragen, aber dann schaffe ich keine 500 werte pro sekunde die ich brauche. jetzt ist meine frage, ob ich eine DLL irgendwie zwei mal laden kann oder so damit jeder thread seine eigene abfragefunktion verwenden kann? das würde das problem imho lösen.
danke für lösungsvorschläge

Geändert von milchbrötchen ( 9. Aug 2012 um 20:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.288 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: problem mit DLL und threads

  Alt 9. Aug 2012, 20:36
Du solltest besser schauen auf welche Daten du nicht threadsicher zugreifst. Ohne zu wissen was du da wie machst (insbesondere das Datenhandling) wird dir dabei aber kaum jemand viel helfen können.

Entscheidend ist z.B., dass du keine globalen Variablen (sind ja eh böse) oder ähnliches benutzt, denn das führt durch die parallelen Zugriffe zu genau solchen Problemen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
milchbrötchen

Registriert seit: 3. Apr 2007
Ort: Konstanz
36 Beiträge
 
#3

AW: problem mit DLL und threads

  Alt 9. Aug 2012, 21:38
also da sollte das problem eigentlich nicht liegen..

Code:
procedure tsensorthread.daten_aufnehmen();
begin
  while self.messen do begin
    self.erg:=s_getvalues(self.id,self.werte); //DLL Funktion
    if self.erg>0 then begin
      ...
    end;
    ...
  end;
end;
es wird die sensor id übergeben und in dem array "werte" habe ich danach die daten. und wenn die funktion parallel aufgerufen wird steht da in beiden arrays jeweils ein mix aus beiden sensordaten drin. das kann ich bei debuggen anhand der daten schließen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: problem mit DLL und threads

  Alt 9. Aug 2012, 21:59
Du hast aber schon für beide Sensoren ein Array und die sind nicht global?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: problem mit DLL und threads

  Alt 9. Aug 2012, 22:07
Ist eine DLL geladen, dann ist diese geladen und wird nicht noch einmal in den Speicher geholt.
Ist diese DLL nicht threadsafe, dann kann man nicht mit mehr als einem Thread darauf zugreifen.

Innerhalb der eigenen Anwendung muss man logischerweise natürlich auch auf threadsafe achten - aber das haben meine Vorredner ja schon angeführt.

Wenn eine DLL nuch doch n-mal geladen werden soll, dann muss diese DLL auch n-mal auf der Platte vorhanden sein, damit Windows sich denkt, oh die ist anders, darum muss ich die jetzt doch laden
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
milchbrötchen

Registriert seit: 3. Apr 2007
Ort: Konstanz
36 Beiträge
 
#6

AW: problem mit DLL und threads

  Alt 9. Aug 2012, 22:27
ja das sollte sicher sein..

Code:
type
  tsensorthread = class(tthread)
    private
      id: integer;
      werte: valArr;
      ...
  end;
...
var
  sensoren: array [1..2] of tsensorthread;
...
gibs denn vielleicht die möglichkeit die DLL zu kopieren, also zb sensor1.dll und sensor2.dll zu haben, und dann sowas wie:

Code:
function s_getvalues(id: longword; values: valArr):longword; cdecl; external 'sensor1.dll';
function s_getvalues(id: longword; values: valArr):longword; cdecl; external 'sensor2.dll';
aber dann gibs ja halt einen funktionsnamen konflikt. also irgendwie sowas in der art
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#7

AW: problem mit DLL und threads

  Alt 9. Aug 2012, 22:33
Was ist valArr?

Delphi-Quellcode:
function getvalues1(id: longword; values: valArr):longword; cdecl; external 'sensor1.dllname 's_getvalues';
function getvalues2(id: longword; values: valArr):longword; cdecl; external 'sensor2.dllname 's_getvalues';
Ist dir noch nie aufgefallen, daß der Name in deinem Quellcode mit dem Exportnamen der DLL nicht viel zu tun hat?

Beispiel:
Delphi-Quellcode:
function CreateFile; external kernel32 name 'CreateFileW'; // bis D2007 CreateFileA
function CreateFileA; external kernel32 name 'CreateFileA';
function CreateFileW; external kernel32 name 'CreateFileW';
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Aug 2012 um 22:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.288 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: problem mit DLL und threads

  Alt 9. Aug 2012, 22:51
Das Problem liegt wohl eher in der DLL. Da werden dann gerne Initialisierungen (hier z.B. der Sensoren) global gemacht oder so.

Wie sieht denn der Quelltext dort grob aus?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: problem mit DLL und threads

  Alt 10. Aug 2012, 00:51
Für so einen Ansatz würde ich empfehlen eine Klasse zu erstellen, die das Kopieren der DLL vornimmt (z.B. in den Temp-Ordner) und die DLL dynamisch lädt.

Wird die Instanz dann ins Nirwana geschickt, dann kann auch die DLL aus dem Temp Ordner gelöscht werden. Um ganz sicher zu gehen, dass die Kopie immer gelöscht wird, kann man. auch noch mit einem speziellen Copy-Befehl dafür sorgen, dass die Datei sich automatisch nach Prozessende von selber löscht.

Resultat:

Der Zugriff auf die DLL Funktionen ist so einfach wie das Benutzen einer Klasse
Die zusätzlichen Daten liegen innerhalb der Klasseninstanz und können dort threadsafe bereitgestellt werden
Bei der Auslieferung des Programms nur eine DLL-Datei und dadurch kein Versionsmischmasch möglich
Weitere Threads problemlos möglich
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: problem mit DLL und threads

  Alt 10. Aug 2012, 02:11
Das halte ich für den falschen Ansatz. Leg die DLL so aus, dass sie threadsafe ist. Zwei mal laden geht in die Hose. Spätestens wenn ein zweiter Progranmmierer sie verwendet und nichts davon weiß. Auch wenn du dir das jetzt nicht vorstellen kannst. Aber glaub mir, in einem halben Jahr bist du der zweite Programmierer.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:50 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