Solved

how to handle postmessage in TThread Objects

Posted on 2001-07-18
18
1,160 Views
Last Modified: 2012-05-04
I have a TThread object and desire to execute within a Postmessage, but so that reason does not execute????? Greetings
Ruben  
0
Comment
Question by:rbarzallo
  • 7
  • 3
  • 2
  • +4
18 Comments
 
LVL 1

Expert Comment

by:bnemmers
ID: 6295438
Try PostThreadMessage

Bill
0
 

Expert Comment

by:comptebidon81
ID: 6295725
If I understood right, you want to start your thread when you receive a PostMessage?

Doing something like this when you receive the PostMessage should start it:
MyThread := TMyThread.Create(False);

If that is already what you did or I didn't understood correctly your question, don't hesitate to tell me!
GunDamn
0
 

Author Comment

by:rbarzallo
ID: 6296002
ok,
thread this in execution and within this execution desire to execute postmessage, thread executes the instruction but not the procedure assigned to the same one (to postmessage). The same it happens to me with postthreadmessage.

Ruben  
 
0
Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

 

Expert Comment

by:comptebidon81
ID: 6296256
Are you posting your message with the right window handle?
I suppose you wish to post a message outSide of the Thread?
If not, maybe you could try to put your PostMessage procedure outside your thread.

If it still doesn't work, I will need a code sample to help you further.
GunDamn
0
 

Expert Comment

by:SMakarenko
ID: 6297266
it may do in the following way :

   TRunThread =class(TThread)
   protected
   private
     FWindowHandle: HWND;
     procedure WndProc(var Msg: TMessage);
     procedure DoAnything;
   public
     procedure Execute;override;
   end;
 
procedure TRunThread.Execute;
begin
  FWindowHandle := AllocateHWnd(WndProc);
  DoSomething;
  DeallocateHWnd(FWindowHandle);
end;


procedure TRunThread.DoAnything;
begin
 ...
end;

procedure TRunThread.WndProc(var Msg: TMessage);
begin
  with Msg do
    if Msg = WM_Thread then
      try
        DoAnything;
      except
        Application.HandleException(Self);
      end
    else
      Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;

 
0
 

Expert Comment

by:SMakarenko
ID: 6297380
in execute  add next text:

  while GetMessage(Msg,0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;



and remove procedure DoSomething;
0
 

Expert Comment

by:SMakarenko
ID: 6297439
in execute  add next text:

  while GetMessage(Msg,0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;



and remove procedure DoSomething;
0
 

Author Comment

by:rbarzallo
ID: 6303121

why not postmessage not processing wmcontrolclose???????

unit pruebas;

interface

uses
  Messages, Forms, Classes, SysUtils,Windows, Dialogs;

const
  wm_Controlclose = WM_User + 1;

type
  ThSwt_Input = class(TThread)
 
  public

    constructor Create(CreateSuspended: Boolean);
    procedure   WmControlclose(var Msg: TMessage); Message wm_ControlClose;

             
  private
    { Private declarations }
    //
  protected
    procedure Execute; override;
    procedure ProceseMessage;
                                 
  end;

var
  ThSwitch_In     : ThSwt_Input;

implementation

{ Important: Methods and properties of objects in VCL can only be used in a
  method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure THDataQueueInput.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ THDataQueueInput }

constructor ThSwt_Input.Create(CreateSuspended: Boolean);
begin
   Inherited Create(CreateSuspended);
end;

procedure ThSwt_Input.Execute;
begin

  { Place thread code here }
ProceseMessage;
   
end;

procedure ThSwt_Input.ProceseMessage;
var
s1 : string;
begin

  PostMessage(Handle,wm_Controlclose ,0,0);

  s1 := 'continuo con la ejecucion del programa';
  showmessage(s1);
 
  // mas codigo del programa

end;

procedure ThSwt_Input.WmControlclose(var Msg: TMessage);
var
s1 : string;
begin
  // realiza proceso interno
  s1 := 'ejecuta postmessage';
  showmessage(s1);
end;                          

end.
0
 

Author Comment

by:rbarzallo
ID: 6303122

why postmessage not processing wmcontrolclose???????

unit pruebas;

interface

uses
  Messages, Forms, Classes, SysUtils,Windows, Dialogs;

const
  wm_Controlclose = WM_User + 1;

type
  ThSwt_Input = class(TThread)
 
  public

    constructor Create(CreateSuspended: Boolean);
    procedure   WmControlclose(var Msg: TMessage); Message wm_ControlClose;

             
  private
    { Private declarations }
    //
  protected
    procedure Execute; override;
    procedure ProceseMessage;
                                 
  end;

var
  ThSwitch_In     : ThSwt_Input;

implementation

{ Important: Methods and properties of objects in VCL can only be used in a
  method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure THDataQueueInput.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ THDataQueueInput }

constructor ThSwt_Input.Create(CreateSuspended: Boolean);
begin
   Inherited Create(CreateSuspended);
end;

procedure ThSwt_Input.Execute;
begin

  { Place thread code here }
ProceseMessage;
   
end;

procedure ThSwt_Input.ProceseMessage;
var
s1 : string;
begin

  PostMessage(Handle,wm_Controlclose ,0,0);

  s1 := 'continuo con la ejecucion del programa';
  showmessage(s1);
 
  // mas codigo del programa

end;

procedure ThSwt_Input.WmControlclose(var Msg: TMessage);
var
s1 : string;
begin
  // realiza proceso interno
  s1 := 'ejecuta postmessage';
  showmessage(s1);
end;                          

end.
0
 

Expert Comment

by:SMakarenko
ID: 6311077
you must create Window in Thread and MessageQueue

  like in my text

FWindowHandle := AllocateHWnd(WndProc);



 

 
0
 

Expert Comment

by:SMakarenko
ID: 6311120
procedure ThSwt_Input.Execute;
begin
  FWindowHandle := AllocateHWnd(WndProc);
  while GetMessage(Msg,0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  DeallocateHWnd(FWindowHandle);
end;



you may postmessage  out From Thread

var
  Thread:ThSwt_Input;

 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Thread := ThSwt_Input.Create(True);
  IsTread:=True;
  Thread.OnTerminate := ThreadTerminate;
  Thread.FreeOnTerminate := True;
  Thread.Resume;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
  SendMessage(Thread.FWindowHandle, WM_USER + 1, 0, 0);
end;




procedure ThSwt_Input.ProceseMessage;
begin
 Synchronize(DoAnything);
end;




procedure ThSwt_Input.DoAnything;
var
s1 : string;
begin
 s1 := 'ejecuta postmessage';
 showmessage(s1);
end;
0
 

Accepted Solution

by:
SMakarenko earned 15 total points
ID: 6311122
procedure ThSwt_Input.WndProc(var Msg: TMessage);
begin
  with Msg do
    if Msg = wm_Controlclose then
      try
        ProceseMessage;
      except
        Application.HandleException(Self);
      end
    else
      Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;
0
 
LVL 2

Expert Comment

by:alexstewart@beta
ID: 6477901
Not wishing to muddy the waters, but you might also look
at the api PostThreadMessage,

Iuse it for talking to threads, you dont need a window handle.

as
0
 
LVL 2

Expert Comment

by:alexstewart@beta
ID: 6477959
oops sorry Bill, you said that.
Any way I do the following..

procedure TMyThread.Execute;
var
   Msg : TMsg;
begin
  PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);// start the thread message queue
  MyThreadId:=ThreadID;// stick the thread id somewhere I can find it.
  MyStartup;
  while True do begin
      if Terminated then Break;//check if anyone called mythread.terminate-
      IF NOT GetMessage(Msg, 0, 0, 0) THEN Break;//could peak here to prevent stall, this returns false if WM_Quit is posted
      MyProcessMsg(msg);//I process the message
      end;
  MyCleanup;
end;

In the main program I call
PostThreadMessage(MyThreadId,wm_xxx,0,0);
0
 

Expert Comment

by:SMakarenko
ID: 6478809
agree
its work :)


rbarzallo wants
postmessage  inner Thread
 
 
0
 

Expert Comment

by:Jgould
ID: 7465427
Dear SMakarenko


I've rejected your proposed answer as Experts Exchange holds an experiment to work without the answer button.

See:        http://www.experts-exchange.com/jsp/communityNews.jsp
Paragraph: Site Update for Wednesday, November 06, 2002

By this rejection the Asker will be notified by mail and hopefully he will take his responsibility to finalize the question or post an additional comment.
The Asker sees a button beside every post which says "Accept This Comment As Answer" (including rejected answers) -- so if he/she thinks yours is the best, you'll be awarded the points and the grade.

This Q hasn't been active lately, thus I've posted it in the CS Cleanup topic area.
I'll return to this Q in seven days to see if any coment has been added, if not then it's my intention that this question is:

-Answered by: SMakarenko

PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER !

Thanks !

Jgould

Community Support Moderator
Experts Exchange
0
 
LVL 26

Expert Comment

by:Russell Libby
ID: 8703524
No comment has been added lately, so it's time to clean up this TA.
I will leave a recommendation in the Cleanup topic area that this question is:

Accept SMakarenko's comment as answer
(will be submitted on 06/18/2003 to cleanup)

Please leave any comments here within the next seven days.
 
PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!
 
Thank you,
Russell

EE Cleanup Volunteer
0

Featured Post

ScreenConnect 6.0 Free Trial

At ScreenConnect, partner feedback doesn't fall on deaf ears. We collected partner suggestions off of their virtual wish list and transformed them into one game-changing release: ScreenConnect 6.0. Explore all of the extras and enhancements for yourself!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Intraweb submit form as a POST request 4 303
TVirtualStringTree  search using TEdit 7 121
delphi prevent click fast 2 215
scroll down TListBox component in Delphi 1 11
This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
In a recent question (https://www.experts-exchange.com/questions/28997919/Pagination-in-Adobe-Acrobat.html) here at Experts Exchange, a member asked how to add page numbers to a PDF file using Adobe Acrobat XI Pro. This short video Micro Tutorial sh…
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question