Einzelnen Beitrag anzeigen

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