AGB  ·  Datenschutz  ·  Impressum  







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

mehrere Thread-Instanzen

Offene Frage von "gnr82"
Ein Thema von gnr82 · begonnen am 10. Okt 2007 · letzter Beitrag vom 11. Okt 2007
Antwort Antwort
Seite 2 von 2     12   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: mehrere Thread-Instanzen

  Alt 11. Okt 2007, 17:39
Unabhängig davon, das es irgendwie nicht richtig funktioniert, würde ich niemals einen Thread so schreiben, das er endlos pollt. Windows ist ein ereignisgesteuertes System, Du solltest also eventorientiert arbeiten.

Erzeuge doch einfach deine TComPort-Instanzen für jeden Port, werte im OnStatechanged, OnDataReceived (oder wie die Ereignisse heißen) die Statii (Statusse?) aus und empfange die Daten in OnDataReceived. Da der 'Sender' (also hier die TComPort-Instanz) mitgeschickt wird, weisst Du genau, auf welchem Port etwas anliegt.

So wird das System unnötig blockiert, weil es ja ständig einen Status abfragt. Das war früher in DOS-Zeiten usus, aber heute sagt uns doch Windows, wer, ob, wann und was am COM-Port rumzuppelt.

Du kannst Dir das auch vermutlich mit einem 'WaitForMultipleObjects' selbst basteln, aber es ist schon 5,6 Jahre her, das ich mich mit COM rumschlagen musste...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
441 Beiträge
 
Delphi 10.3 Rio
 
#12

Re: mehrere Thread-Instanzen

  Alt 11. Okt 2007, 19:44
Also wie schon oben gesagt, das pollen im Execute ist sicher nicht die feine englische Art. Mit MSDN-Library durchsuchenWaitCommEvent und einer Overlapped-Struktur bereitest du die Comm-Events vor. Über eigene Events kannst Du dir das Öffnen/Schließen und Beenden deines Threads realisieren. Mit MSDN-Library durchsuchenWaitForMultipleObjects wartest du dann:

Delphi-Quellcode:
procedure TCommThread.Execute;
var
  Handles: Array[0..3] Of THandle;
  dummy: DWord;
begin
  Handles[0] := hTerminateEvent;
  Handles[1] := iOverlapped.hEvent;
  Handles[2] := hClosePortEvent;
  Handles[3] := hOpenPortEvent;
  repeat
    WaitCommEvent(FCommHandle, FEvtMask, @iOverlapped); // Init Wait (returnes immediately, because of overlapped event)
    Case WaitForMultipleObjects(4, @Handles, FALSE, INFINITE) Of // Wait for an event to occur
      WAIT_OBJECT_0+0: Begin
                         Terminate;
                         Break;
                       End;
      // Zeichen empfangen
      WAIT_OBJECT_0+1: Begin
                         If GetOverlappedResult(FCommHandle, iOverlapped, dummy, FALSE) Then Begin
                           If ClearCommError(FCommHandle, fErrorMask, @fCT) Then Begin
                             If (fEvtMask=EV_RXCHAR) And (fCT.cbInQue=0) Then Continue; // restart loop!!

                             If Assigned(FOnThreadEvent) Then Synchronize(DoOnThreadEvent);
                           End
                           Else GetLastError; // returns 6 (INVALID_HANDLE)
                         End
                         Else Begin
                           dummy := GetLastError; // reset error
                           ResetEvent(iOverlapped.hEvent); // new 30.6.2003 (reset false event)
                         End;
                       End;

      // Schnittstelle schließen
      WAIT_OBJECT_0+2:
      Begin
        CloseHandle(fCommHandle);
        fCommHandle := INVALID_HANDLE_VALUE;
        ResetEvent(hClosePortEvent);
      End;

      // Schnittstelle öffnen
      WAIT_OBJECT_0+3:
      Begin
        InitializePort;
        ResetEvent(hOpenPortEvent);
      End;


      else Begin
        // Should never happen (DON'T EXIT)
      End;
    End;
  until Terminated;

  CloseHandle(FCommHandle);
  fCommHandle := INVALID_HANDLE_VALUE;

  CloseHandle(iOverlapped.hEvent);
  CloseHandle(hTerminateEvent);
  CloseHandle(hClosePortEvent);
  CloseHandle(hOpenPortEvent);
end;
Das ist ein Auszug aus meiner eigenen Komponente, das Schreiben besorgt ein eigener WriteThread - für alle Comms gemeinsam.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: mehrere Thread-Instanzen

  Alt 11. Okt 2007, 19:58
Wie wäre es mit WorkerThreads? MSDN-Library durchsuchenQueueUserWorkItem Jemad hier im Forum hat eine ähnliche Funktionalität auch mal selber implementiert. Musst du mal etwas im Forum suchen. Leider fällt mir der Autor nicht mehr ein.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#14

Re: mehrere Thread-Instanzen

  Alt 11. Okt 2007, 20:45
Ich, hier

Ich muss aber nochmal betonen, das das unnötig ist. Wie Whookie schon gezeigt hat, sollte das nur mit einem einzigen Thread ablaufen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  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 06:19 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