AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi [Indy 10] IRC-Client in eigenem thread auslagern
Thema durchsuchen
Ansicht
Themen-Optionen

[Indy 10] IRC-Client in eigenem thread auslagern

Ein Thema von Sfaizst · begonnen am 10. Dez 2010 · letzter Beitrag vom 22. Dez 2010
Antwort Antwort
Sfaizst

Registriert seit: 16. Jun 2008
33 Beiträge
 
#1

[Indy 10] IRC-Client in eigenem thread auslagern

  Alt 10. Dez 2010, 02:43
Guten Morgen allerseits,

ich habe mich leider schon ganz schön lange nicht mehr richtig mit multithreading beschäftigt, so bin ichs der materie ein wenig drausen, jetzt müsste ich jedoch einen IRC-Client, welcher zur Laufzeit im eigenem Thread laufen soll auf mein programm bringen...

Das problem ist folgendes: Das erstellen vom Thread funktioniert an sicht und das joinen auch (aufm Server nachgeguckt), die Frage ist jedoch, wie "empfange" ich Daten, die der Server verschickt?

Meine Bisherigen Zeilen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IDIRC, IDContext, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
  procedure ReceiveIRC(ASender: TIdContext; const ANicknameFrom, AHost, ANicknameTo, AMessage: String);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  type TIRC = class(TThread)
    private
    FConnected : Boolean;
    public
    IRC : TIDIRC;
    Host : AnsiString;
    Port : Word;
    constructor Create(CreateSuspended:Boolean);
    procedure StartIRC(Channel,MyName : AnsiString);
    procedure Execute; override;
    destructor Free;
end;

var
  Form1: TForm1;
  IRC : TIRC;

implementation

{$R *.dfm}

constructor TIRC.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  IRC := TIDIRC.Create(NIL);
  Host := 'myserver';
  Port := 6667;
end;

procedure TIRC.StartIRC(Channel, MyName : AnsiString);
begin
  IRC.Host := Host;
  IRC.Port := Port;
  IRC.Username := MyName;
  IRC.Realname := MyName;
  IRC.Nickname := MyName;
  IRC.OnPrivateMessage := Form1.ReceiveIRC;
  IRC.Connect;
  IRC.Join(Channel);
  FConnected := True;
end;

procedure TIRC.Execute;
var
  ASender : TIDContext;
  ANick,AHost,ANickTo,AMessage : String;
begin
  while (not Self.Terminated) do
    begin
      if (FConnected) and (IRC.Connected) then
        //Wie lese ich hier die Daten (/hole sie ab), wenn etwas ankommt, so, dass OnPrivateMessage aufgerufen wird?
    end;
end;

destructor TIRC.Free;
begin
  try
  IRC.Free;
  except
  end;
  inherited Destroy;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Channel, MyName : AnsiString;
begin
  IRC := TIRC.Create(false);
  Channel := 'channel';
  MyName := 'User001';
  IRC.StartIRC(Channel,MyName);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  IRC.Free;
end;

procedure TForm1.ReceiveIRC(ASender: TIdContext; const ANicknameFrom: string; const AHost: string; const ANicknameTo: string; const AMessage: string);
begin
  if AMessage <> 'then
     Memo1.Lines.Add(AMessage);
end;
Es ist noch nicht alles so, wie ichs am ende haben möchte, jedoch geht es im prinzip momentan eher nur um die procedure TIRC.Execute...

Viele Grüße

Sfaizst

Geändert von Sfaizst (10. Dez 2010 um 03:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: [Indy 10] IRC-Client in eigenem thread auslagern

  Alt 10. Dez 2010, 02:53
Laufen die Indys nicht schon von Haus aus in einem Thread? D.h. darum müsstest du dich gar nicht kümmern.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Sfaizst

Registriert seit: 16. Jun 2008
33 Beiträge
 
#3

AW: [Indy 10] IRC-Client in eigenem thread auslagern

  Alt 10. Dez 2010, 03:12
Hmm, das kann ich leider nicht genauer sagen, ich habe die komponente mal zur Laufzeit ohne extra Thread probiert und als der Server nicht erreichbar war (wlan abgeschmiert) hing die Form für 30 Sekunden, so gehe ich davon aus, dass es eben nicht im eigenem Thread läuft.
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: [Indy 10] IRC-Client in eigenem thread auslagern

  Alt 10. Dez 2010, 08:15
Hi,

die Server laufen in seperaten Threads für die jeweiligen Clients.
Die Clients laufen ohne eigenen Thread,
deshalb empfielt es sich die Client-Kommunikation in einen
seperaten Thread auszulagern, wie Du es auch schon angefangen hast.

Greetz Data

P.S.: Ohnen Thread sollte man die TIdAntiFreeze Komponente auf die Form ziehen.
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Sfaizst

Registriert seit: 16. Jun 2008
33 Beiträge
 
#5

AW: [Indy 10] IRC-Client in eigenem thread auslagern

  Alt 11. Dez 2010, 10:52
Danke für die Info,

das Problem ist aber im eigentlichen, dass ich nicht weiß, wie ich die IRC Narichten abholen kann, bei sockets,... gibt es ja eine Procedure um eingegangene Narichten abzuholen, aber welche ist das beim IRC?

Zitat:
P.S.: Ohnen Thread sollte man die TIdAntiFreeze Komponente auf die Form ziehen.
Funktioniert dies nur bei Komponenten die zur Designtime erstellt wurden oder auch bei denen, die zur Laufzeit erstellt werden? (hatte zudem nie besonders viel Freude mit TIdAntifreeze als ich mit TIDHttp rumgespielt hatte und damit einen Download realisiert hatte, da war das auslagern im eigenem Thread wesentlich besser)

Sfaizst

Geändert von Sfaizst (12. Dez 2010 um 02:40 Uhr) Grund: undeutlich formuliert :D
  Mit Zitat antworten Zitat
Sfaizst

Registriert seit: 16. Jun 2008
33 Beiträge
 
#6

AW: [Indy 10] IRC-Client in eigenem thread auslagern

  Alt 21. Dez 2010, 21:29
hallo, ich habe inzwischen das Ding mit IDAntiFreeze probiert, das Resultat ist aber nicht wirklich zufriedenstellend, die Form hängt regelmäßig,...

Kann mir denn niemand sagen, wie ich die IRC Narichten im Thread abholen kann und somit dann OnPrivateMessage aufrufen kann?

Grüßle
  Mit Zitat antworten Zitat
Antwort Antwort


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 - 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