![]() |
Re: Thread in dll
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.... |
Re: Thread in dll
Zitat:
|
Re: Thread in dll
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:
DoEvents macht dann folgendes:
procedure TComThread.DispatchComMsg;
begin FComPort.FSynchronizer.beginRead; DoEvents; FComPort.FSynchronizer.EndREad; end;
Delphi-Quellcode:
und in Call RxChar (wo die Callback aufgerufen wird) passiert das:
procedure TComThread.DoEvents;
begin FComPort.CallRxChar; end;
Delphi-Quellcode:
Viel Code, aber vielleicht ist es so verständlicher wie das Teil aufgebaut ist.
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; |
Re: Thread in dll
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. |
Re: Thread in dll
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. |
Re: Thread in dll
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?
|
Re: Thread in dll
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 |
Re: Thread in dll
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...
|
Re: Thread in dll
ok getan ;-) vielen Dank schon mal wieder!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 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