AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Nachrichtenverarbeitung zwischen Threads

Ein Thema von R2009 · begonnen am 22. Jan 2010 · letzter Beitrag vom 22. Jan 2010
Antwort Antwort
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#1

Nachrichtenverarbeitung zwischen Threads

  Alt 22. Jan 2010, 06:19
Hi,

wir implementieren ein Nachrichtenaustausch zwischen 2 Threads mittels PostThreadMessage und einer
entsprechenden Auswertungsmethode in jedem Thread.

2 Probleme sind aufgetaucht:

1.) selbst beim einfachsten Thread funktioniert das nur wenn in der Hauptschleife des Thread
application.processmasseges steht.

2.) es funktioniert nur stablil wenn PostThreadMessage in einem Event, also in einem Timerevent oder
in einem Event einer seriellen Schnittstelle aufgerufen wird. Rufe ich PostThreadMessage im Thread
irgendwo sonst auf wird die Nachricht manchmal gesendet manchmal nicht. PostThreadMessage gibt jedesmal
true zurück, die Nachricht müsste also abgesetzt sein.

In dem Problemthread sind allerdings auch ein Timer (Delphi) und eine serielle Schnittstellenkomponente (Asynchpro)
implementiert. Klaut mir da jemand meine Messages?
Kann ich die Messageverarbeitung irgendwie erzwingen?

Grüsse
Rainer

PS: den Code kann ich hier nicht ablegen ist mittlerweile zu umfangreich.
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Nachrichtenverarbeitung zwischen Threads

  Alt 22. Jan 2010, 11:16
Delphi-Quellcode:
type

  TThread1 = class(TThread)
    public
      MainWnd:hwnd;
      otherThread:TThread;
      procedure Terminate;
    protected
      procedure execute; override;
  end;

  TThread2 = class(TThread)
    public
      MainWnd:hwnd;
      otherThread:TThread;
      procedure Terminate;
    protected
      procedure execute; override;
    private
      FTimer:TTimer;
      procedure TimerTimer(Sender:TObject);
  end;


  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    Thread1:TThread1;
    Thread2:TThread2;
    procedure ThreadMessage(var msg:TMessage); message WM_User;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TThread1 }

procedure TThread1.execute;
var msg:TMsg;
begin
  while getmessage(msg,0,0,0) do
  begin
    postmessage(MainWnd,WM_User,0,1);
    postThreadmessage(otherThread.ThreadID,WM_user,0,0);
    Dispatchmessage(msg);
  end;
end;

procedure TThread1.Terminate;
begin
  inherited;
  PostThreadMessage(ThreadID,WM_Quit,0,0);
end;

{ TThread2 }

procedure TThread2.execute;
var msg:TMsg;
begin
  FTimer:=TTimer.Create(nil);
  FTimer.Interval:=1000;
  FTimer.OnTimer:=TimerTimer;
  FTimer.Enabled:=true;
  while getmessage(msg,0,0,0) do
  begin
    postmessage(MainWnd,WM_User,0,2);
    Dispatchmessage(msg);
  end;
end;

procedure TThread2.Terminate;
begin
  inherited;
  PostThreadMessage(ThreadID,WM_Quit,0,0);
end;

procedure TThread2.TimerTimer(Sender: TObject);
begin
  postmessage(MainWnd,WM_user,0,0);
  PostThreadMessage(otherThread.ThreadID,WM_User,0,0);
end;

{ TForm1 }

procedure TForm1.ThreadMessage(var msg: TMessage);
begin
  memo1.lines.add(inttostr(msg.lparam));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Thread1:=TThread1.Create(true);
  Thread2:=TThread2.Create(true);
  Thread1.otherThread:=Thread2;
  Thread2.otherThread:=Thread1;
  Thread1.MainWnd:=handle;
  Thread2.MainWnd:=handle;
  Thread1.Resume;
  Thread2.Resume;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Thread1.Terminate;
  Thread2.Terminate;
  Thread1.WaitFor;
  Thread2.WaitFor;
  Thread1.Free;
  Thread2.Free;
end;
Funktioniert.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.003 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Nachrichtenverarbeitung zwischen Threads

  Alt 22. Jan 2010, 12:23
Zitat von sirius:

Delphi-Quellcode:
  Thread1.Resume;
  Thread2.Resume;
Funktioniert.
TThread.Resume (und Suspend) sind nun in Delphi 2010 'deprecated' (wegen möglicher Probleme mit dem bisherigen Code):

http://stackoverflow.com/questions/1...-used-in-place

Jaja, der Fortschritt ...

Michael
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Nachrichtenverarbeitung zwischen Threads

  Alt 22. Jan 2010, 17:17
Na dann halt TThreadx.Start.

Ist nur die Frage, ob dann intern der Stread erst bei start initialisiert wird und damit davor noch keine ThreadID existiert.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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