Announcement

Collapse
No announcement yet.

Event und Thread

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Event und Thread

    Hallo !

    Ich versuche eine Komponente zu entwickeln, in der Threads ausgeführt werden. Nun versuche ich in einem Thread ein Ereigniss zu generieren. Meine Frage lautet: Wie kann ich aus einem Thread ein Event meiner Komonente erzeugen ??

    Danke
    Sascha

  • #2
    Hallo Sascha,<br>Du könntest innerhalb des Threads über Synchronize
    eine Methode der Komponente aufrufen. Innerhalb der Komponentenmethode generierst Du dann das Event

    Comment


    • #3
      Das habe ich schon versucht. Bekomme aber immer ne Exception.
      Hier mal nen Auszug aus meinem Code:
      <pre>
      //Meine Synchronize des Threads
      procedure MyThread.sync;
      begin
      //Serport is ne privates Feld
      SerPort.DataSend(SerPort);
      end;
      </pre>

      <pre>
      //Komponentenmethode
      procedure TSeriellPort.DataSend(Sender: TObject);
      begin
      if assigned(OnDataSend)
      then OnDataSend(Sender);
      end;
      </pre>

      Danke
      Sasch

      Comment


      • #4
        Der obige Code scheint ok zu sein. Es wäre also hilfreich die Deklarationeen des Threads+SerPort+Form zu sehen. Wahrscheinlich ist Serport kein gültiges Object, oder aber die Art&Weise wie MyThread.Sync aufgerufen wird ist falsch.<br>
        More input please

        Gruß Hage

        Comment


        • #5
          OK.
          Deklaration des Thread:
          <pre>
          type
          MyThread = class(TThread)
          private
          hFile : THandle;
          Mask : cardinal;
          SerPort : TSeriellPort;
          procedure sync;
          { Private-Deklarationen }
          protected
          procedure Execute; override;
          public
          constructor Create(CreateSuspended: Boolean;Handle: THandle);
          end;
          </pre>

          Execute-Methode das Threads:
          <pre>
          procedure MyThread.Execute;
          begin
          WaitCommEvent(hFile,Mask,nil);

          while not terminated do begin

          if (Mask and EV_TXEMPTY) > 0 then
          Synchronize(sync);

          end;
          end;
          </pre>

          Deklarationen der Komponente:
          <pre>
          Type
          TOnDataSendEvent = procedure(Sender: TObject) of Object;

          ESeriellPort = class(Exception);

          TStopBits = (Eins, Eins_5, Zwei);
          TParity = (Kein, Ungerade, Gleich, Makierung, Leerzeichen);

          type
          TSeriellPort = class(TComponent)
          private

          FOnDataSend: TOnDataSendEvent;
          FOnDataAvailable: TDataAvailableEvent

          procedure DataSend(Sender: TObject);
          { Private-Deklarationen }
          protected
          { Protected-Deklarationen }
          public
          Constructor Create(AOwner: TComponent); override;
          Destructor Destroy; override;

          Procedure SendData;
          { Public-Deklarationen }
          published
          property OnDataAvailable: TDataAvailableEvent read FOnDataAvailable write FOnDataAvailable;
          property OnDataSend : TOnDataSendEvent read FOnDataSend write FOnDataSend;
          { Published-Deklarationen }
          end;
          </pre>

          Hoffe ich habe jetzt das wichtigste Schonmal Danke für Eure Hilfe !

          MfG
          Sasch

          Comment


          • #6
            Hi Sascha,

            deine .Execute; Methode ist sehr kurios, sollte sie nicht so sein ?

            <pre>

            procedure MyThread.Execute;
            var
            Mask: Cardinal;
            begin
            while not Terminated do
            begin
            WaitCommEvent(hFile, Mask, nil);
            if (Mask and EV_TXEMPTY) <> 0 then Synchronize(sync);
            end;
            end;

            </pre>

            Gruß Hage

            Comment


            • #7
              Übrigens, es gibt schon sehr gute und fertige Serial Port Komponenten. Das was ich aus deinem Source erkennen konnte zeigt mir das es vieleicht hilfreich für dich wäre diese Komponeten zu downloaden und in deren Sourcen nachzuschauen wie andere Programmierer mit viel Erfahrung es machen.<br>
              Normalerweise sollte man nicht deinen Weg über Threads+Synchronization gehen, sondern über "Overlapped IO" Zugriffe. Dabei wird per Windows-Event-Handles gearbeitet, was dazu führt das man keinerlei unötige Blockierungen oder unerwartete Timeouts bekommt.

              Gruß Hage

              Comment


              • #8
                Du hast bestimmt recht. Ich sollte mir mal fertige Komponenten anschauen. Könntest Du mir welche empfehlen, bei denen man auch den Quellcode hat und somit was lernen kann.

                Gruss
                Sasch

                Comment

                Working...
                X