AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread in dll

Ein Thema von clownxx · begonnen am 10. Dez 2007 · letzter Beitrag vom 13. Dez 2007
Antwort Antwort
Seite 2 von 2     12   
clownxx

Registriert seit: 18. Jun 2003
63 Beiträge
 
#11

Re: Thread in dll

  Alt 11. Dez 2007, 23:23
so...die Probleme gehen weiter
Wenn ich nun BeginRead vor DoEvents setze, kehrt er niemals mehr wieder aus der BeginRead Funktion zurück, es kommt somit nie zur Ausführung von DoEvents. Es scheint also das gleiche Problem wie mit Synchronize....
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#12

Re: Thread in dll

  Alt 12. Dez 2007, 00:00
Zitat von clownxx:
Wenn ich nun BeginRead vor DoEvents setze, kehrt er niemals mehr wieder aus der BeginRead Funktion zurück, es kommt somit nie zur Ausführung von DoEvents. Es scheint also das gleiche Problem wie mit Synchronize....
Das kann eigentlich nur sein, wenn du ein BeginWrite nie wieder mit EndWrite abschließt. Du musst nur den reinen Zugriff auf den Datenspeicher entsprechend umfassen, aber nicht den Code drumherum.
  Mit Zitat antworten Zitat
clownxx

Registriert seit: 18. Jun 2003
63 Beiträge
 
#13

Re: Thread in dll

  Alt 12. Dez 2007, 10:01
mh ok. Es geht ja eigentlich bei dem Datenspeicher um diese TComport komponenten, da kann ich nun nicht so wirklich feststellen was da nun der Datenspeicher ist....Ich habe es nun so gemacht:

Delphi-Quellcode:
procedure TComThread.DispatchComMsg;
begin
  FComPort.FSynchronizer.beginRead;
  DoEvents;
  FComPort.FSynchronizer.EndREad;
end;
DoEvents macht dann folgendes:

Delphi-Quellcode:
procedure TComThread.DoEvents;
begin
  FComPort.CallRxChar;
end;
und in Call RxChar (wo die Callback aufgerufen wird) passiert das:

Delphi-Quellcode:
procedure TCustomComPort.CallRxChar;
var
  Count: Integer;

  // read from input buffer
  procedure PerformRead(var P: Pointer);
  begin
    GetMem(P, Count);
    Read(P^, Count);
    // call OnRxBuf event
    DoRxBuf(P^, Count);
  end;

  // check if any component is linked, to OnRxChar event
  procedure CheckLinks;
  {$WARNINGS OFF}
  var
    I: Integer;
    P: Pointer;
    ComLink: TComLink;
    ReadFromBuffer: Boolean;
  begin
    // examine links
    if (Count > 0) and (not TriggersOnRxChar) then
    begin
      ReadFromBuffer := False;
      try
        // cycle through links
        for I := 0 to FLinks.Count - 1 do
        begin
          ComLink := TComLink(FLinks[I]);
          if Assigned(ComLink.OnRxBuf) then
          begin
            // link to OnRxChar event found
            if not ReadFromBuffer then
            begin
              // TCustomComPort must read from comport, so OnRxChar event is
              // not triggered
              ReadFromBuffer := True;
              PerformRead(P);
            end;
            // send data to linked component
            ComLink.OnRxBuf(Self, P^, Count);
          end
        end;
        if (not ReadFromBuffer) and (not FTriggersOnRxChar) then
        begin
          ReadFromBuffer := True;
          PerformRead(P);
        end;
      finally
        if ReadFromBuffer then
        begin
          FreeMem(P);
          // data is already out of buffer, prevent from OnRxChar event to occur
          Count := 0;
        end;
      end;
    end;
  end;

begin
  Count := InputCount;
  //@clownxx
  FSynchronizer.BeginRead;
  ///
  if Count > 0 then
    SendSignalToLink(leRx, True);
  CheckLinks;
  if Count > 0 then
    DoRxChar(Count);
  //@clownxx
  FSynchronizer.EndRead;
  ///
end;
Viel Code, aber vielleicht ist es so verständlicher wie das Teil aufgebaut ist.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#14

Re: Thread in dll

  Alt 13. Dez 2007, 09:44
Ich habe ein leichtes Verständnisproblem: Die Komponente für den COM Port arbeitet doch intern schon entweder mit einem Thread oder über Events. Warum baust du nun einen Thread da nochmal drumherum? Ich kapier das nicht.

Selbst nach einer Nacht drüber schlafen, ist mir das noch nicht klar geworden.
  Mit Zitat antworten Zitat
clownxx

Registriert seit: 18. Jun 2003
63 Beiträge
 
#15

Re: Thread in dll

  Alt 13. Dez 2007, 10:06
Sorry wenn ich mich unverständlich ausgedrückt habe! Es gibt die Comportcomponente und den Thread (der ist un der Unit der Comport komponente)

FEventThread: TComThread;

ist ein Memberobject der Klasse TCustomComport (worin sich ja auch onRXChar, wie im vorherigen Post beschrieben, befindet)

Weitere Threads brauche ich nicht. Der Thread schaut nach events und feuert die Callbacks.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#16

Re: Thread in dll

  Alt 13. Dez 2007, 10:23
Ok, du hast diesen Thread hinzugefügt - direkt in die Komponente. Und wozu? Die Componente hat doch Callbacks. Da kannst du dich ranhängen und auf das jeweilige Event der COM Port Komponente reagieren - z.B. wenn Zeichen empfangen wurden, diese interpretieren. Wenn du was empfangen hast und es interpretieren konntest, dann rufe die Callbacks zu deiner App auf. Aber warum noch ein Thread?
  Mit Zitat antworten Zitat
clownxx

Registriert seit: 18. Jun 2003
63 Beiträge
 
#17

Re: Thread in dll

  Alt 13. Dez 2007, 12:11
nein, der Thrad ist schon vorhanden....ich habe das nicht hinzugefügt. Ich möchte diese Komponente lediglich in eine DLL Kapseln. Das klappt aber nicht, da der Thread synchronize ausführt um ein Event aufzurufen. Das klappt zwar wenn man die Komponente in eine Anwendung einbindet, aber nicht in der DLL. Da kommen dann keine Events an. Wenn du magst oder es einfach wird, kann ich dir auch die Komponente mal mailen oder auf einem Webspace zur verfügung stellen.
Danke!!

Grüße
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#18

Re: Thread in dll

  Alt 13. Dez 2007, 13:38
Ok, hat etwas gedauert, aber nun habe ich das ganze kapiert. Schick mir einfach mal die Komponente (hier im PN System sind Anhänge möglich) und dann schau ich mal...
  Mit Zitat antworten Zitat
clownxx

Registriert seit: 18. Jun 2003
63 Beiträge
 
#19

Re: Thread in dll

  Alt 13. Dez 2007, 15:27
ok getan vielen Dank schon mal wieder!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 14:34 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