[delphi] Gegevens terugsturen: Class <-- Class

Pagina: 1
Acties:
  • 522 views sinds 30-01-2008
  • Reageer

  • Possstema
  • Registratie: Juli 2002
  • Laatst online: 16-02 09:48
Ik heb een probleem. Ik heb een classe waarin een thread-classe wordt gecreate. En de thread controleerd een TCP-client op inkomende berichten van een server. Nu heeft de classe een verwerk( bericht ) functie alleen nu krijg ik het niet voormekaar om de thread.execute een functie te laten aanroepen uit de classe waarin hij zelf is gemaakt.

Wat ik al heb geprobeerd: Ik gaf een pointer mee van de hooftclasse bij het createn van de thread en die pointer dan gebruiken als pointer.verwerk( bericht ) in de thread.execute. Maar dat vindt delphi niet goed. Heeft iemand een idee hoe ik dit ( netjes ) kan oplossen?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Misschien leuk als je erbij vertelt wat Delphi niet leuk vindt aan jouw oplossing. Zo blijft het een beetje raadwerk. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Voeg aan je thread object een event property toe, bijvoorbeeld een TNottification.
In je hoofdklasse maak je een procedure met een gelijke parameterlijst als je event property.

instantieer je thread suspended en vul de property in je thread met de waarde van je procedure in je hoofdklasse.

Nu kun je (eventueel synchronized) je event aanroepen en zal de code in je hoofdklasse worden uitgevoerd.

  • Possstema
  • Registratie: Juli 2002
  • Laatst online: 16-02 09:48
De error die ik krijg is: System error 1400 ongeldige vensteringang

Edit @ Robbemans: Pfwiew, daar snap ik niet zo veel van, k zal me even verdiepen in property's.

Om wat te verduidelijken:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  TRecThread = class( TThread )
    private
      client : TIdTCPClient;
      ChatP : pointer;
    public
      constructor create( client : TIdTCPClient; ChatP : pointer );
      procedure execute; override;
  end;

  TChatP = class( TObject )
    private
      client : TIdTCPClient;
      username : string;
      password : string;
      host : string;
      port : integer;
      transaction_id : integer;
      rec_thread : TRecThread;
    public
      log : TStrings;
      constructor create( client : TIdTCPClient; username, password, host : string; port : integer );
      function tr_id : string;
      function connect : boolean;
      procedure disconnect;
      procedure process_msg( msg : string );
      procedure send( msg : string );
  end;

[ Voor 89% gewijzigd door Possstema op 06-05-2006 22:35 ]


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Om mezelf dan maar wat wat te verduidelijken, effe uit het hoofd:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  TRecThread = class( TThread )
    private
      client : TIdTCPClient;
      FThreadNotify: TNotification;
    public
      constructor create(Suspended: Boolean)
      procedure execute; override;
      property ThreadNotify: TNotification read FThreadNotify write FThreadNotify 
  end;

  TChatP = class( TObject )
    private
      client : TIdTCPClient;
      username : string;
      password : string;
      host : string;
      port : integer;
      transaction_id : integer;
      rec_thread : TRecThread;
      procedure ChatThreadNotify(Sender: TObject);
    public
      log : TStrings;
      constructor create( client : TIdTCPClient; username, password, host : string; port : integer );
      function tr_id : string;
      function connect : boolean;
      procedure disconnect;
      procedure process_msg( msg : string );
      procedure send( msg : string );
  end;


...

implementation


constructor TChatP.Create(...)
begin
  rec_thread := TRecThread.Create(True);
  rec_thread.ThreadNotify := ChatThreadNotify; // Gebruik ThreadNotify in je thread om ChatThreadNotify aan te roepen
  rec_thread.Resume;
end;

[ Voor 28% gewijzigd door Robbemans op 06-05-2006 22:52 ]


  • Possstema
  • Registratie: Juli 2002
  • Laatst online: 16-02 09:48
Hmm, k kom er niet echt uit, hij kent TNotification niet. Ik zal nog eens nadenken of ik het ook anders kan oplossen.

Edit: Moet TNotification ook TNotifyEvent zijn?

Edit2: Hmm, het werkt als ChatThreadNotify(Sender: TObject); gebruik, alleen hoe kan ik nou eits meegeven ( zoals een string ) ChatThreadNotify( msg : string ); mag niet.

[ Voor 53% gewijzigd door Possstema op 07-05-2006 00:54 ]


  • Possstema
  • Registratie: Juli 2002
  • Laatst online: 16-02 09:48
Ik heb het :), en het werkt ook nog :P . Ik roep dus die ThreadNotify( self ) aan waarmee in de ChatThreadNotify een process_msg(TRecThread(Sender).msg); staat ( of was dat ook de bedoeling :) ). iig hartelijk bedankt. Als ik klaar met het project ben zal ik de source posten :).

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je moet nog wel je best doen om die code thread safe te maken. Bijvoorbeeld met Synchronize. Zie http://www.nldelphi.com/c...s.exe/?Category=Threading

We adore chaos because we like to restore order - M.C. Escher


  • Possstema
  • Registratie: Juli 2002
  • Laatst online: 16-02 09:48
LordLarry schreef op zondag 07 mei 2006 @ 10:45:
Je moet nog wel je best doen om die code thread safe te maken. Bijvoorbeeld met Synchronize. Zie http://www.nldelphi.com/c...s.exe/?Category=Threading
Zoiets dus:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
procedure TRecThread.SyncedProc;
begin
  repeat
    msg := client.ReadLn(); // Try to read a message send from the server
    ThreadNotify( self );   // Sends the message to the TChatP Class to process
  until terminated;
end;

procedure TRecThread.execute;
begin
  Synchronize( SyncedProc );
end;


Dan werkt het wel, maar als de TCP server dan stopt met zenden dan hangt het programma ook.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Erm, nee. Zoiets dus:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
procedure TRecThread.SyncedProc;
begin
  ThreadNotify( self );   // Sends the message to the TChatP Class to process
end;

procedure TRecThread.execute;
begin
  repeat
    msg := client.ReadLn(); // Try to read a message send from the server
    Synchronize( SyncedProc );
   until terminated;
end;

We adore chaos because we like to restore order - M.C. Escher


  • Possstema
  • Registratie: Juli 2002
  • Laatst online: 16-02 09:48
helemaal top, t werkt nu perfect, Bedankt !! _/-\o_
Pagina: 1