我的Java方面博客

          天下難事必做于易,天下大事必做于細

          常用鏈接

          統計

          最新評論

          PostMessage和SendMessage區別

          PostMessage 只是把消息放入隊列,不管其他程序是否處理都返回,然后繼續執行 ;
          SendMessage 必須等待其他程序處理消息后才返回,繼續執行。
          PostMessage
          的返回值表示 PostMessage 函數執行是否正確 ;
          SendMessage 的返回值表示其他程序處理消息后的返回值。
          使用這兩個發送消息函數的最重要的是要看你的程序是否要對消息的滯后性關注否 ,PostMessage 會造成消息的滯后性 , SendMessage 則不會 , 但如果 SendMessage 消息處理失敗 , 則會造成程序停止 !

          為了讓大家能清楚的看到他們的效果,可以用下面的代碼進行測試:
          unit Unit1;

          interface

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

          type
            TForm1 
          = class(TForm)
              mmo1: TMemo;
              btn2: TButton;
              btn3: TButton;
              procedure btn2Click(Sender: TObject);
              procedure btn3Click(Sender: TObject);
            
          private
              
          { Private declarations }
              procedure testPostMessage;
              procedure testSendMessage;
            
          public
              
          { Public declarations }
            end;

          var
            Form1: TForm1;

          implementation

          uses uFile;

          {$R *.dfm}
          var
            f: TFile;

          procedure TForm1.btn2Click(Sender: TObject);
          var
            i: Integer;
          begin
            testPostMessage;
            
          for i := 0 to 5000 do
            begin
              mmo1.Lines.Add(IntToStr(i)
          +'======');
            end;
          end;

          procedure TForm1.btn3Click(Sender: TObject);
          var
            i: Integer;
          begin
            testSendMessage;
            
          for i := 0 to 5000 do
            begin
              mmo1.Lines.Add(IntToStr(i)
          +'======');
            end;
          end;

          procedure TForm1.testPostMessage;
          var
            i: Integer;
          begin
            PostMessage(f.Handle, WM_TEST, 
          00);
            
          for i := 0 to 5000 do
            begin
              mmo1.Lines.Add(IntToStr(i))
            end;
          end;

          procedure TForm1.testSendMessage;
          var
            i: Integer;
          begin
            SendMessage(f.Handle, WM_TEST, 
          00);
            
          for i := 0 to 5000 do
            begin
              mmo1.Lines.Add(IntToStr(i))
            end;
          end;

          initialization
            
          if f = nil then
              f :
          = TFile.Create;

          finalization
            
          if f <> nil then
              FreeAndNil(f);;

          end.


          unit uFile;

          interface

          uses
            Classes, Windows, Forms, Messages;

          const
            WM_TEST 
          = WM_USER + 1;

          type
            TFile 
          = class
            
          private
              FHandle: HWND;
            
          protected
              procedure WndProc(var Msg: TMessage);
            
          public
              procedure AfterConstruction; override;
              procedure BeforeDestruction; override;
              property Handle: HWND  read FHandle;
            end;

          implementation

          { TFile }

          procedure TFile.AfterConstruction;
          begin
            inherited;
            FHandle :
          = AllocateHWnd(WndProc);
          end;

          procedure TFile.BeforeDestruction;
          begin
            inherited;
            DeallocateHWnd(FHandle);
          end;

          procedure TFile.WndProc(var Msg: TMessage);
          begin
            
          if msg.Msg = WM_TEST then
            begin
              
          //消息處理內容
              Application.MessageBox('WM_TEST''WM_TEST'0);
            end;  
            windows.DefWindowProc(FHandle, Msg.Msg, Msg.wParam, Msg.lParam);
          end;

          end.

          posted on 2007-09-03 14:28 張樹坤 閱讀(1489) 評論(0)  編輯  收藏 所屬分類: Windows編程


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 马边| 高陵县| 玉门市| 游戏| 乌审旗| 揭西县| 双辽市| 罗田县| 汾西县| 吉林市| 武定县| 银川市| 大丰市| 纳雍县| 新晃| 定南县| 绥中县| 建瓯市| 延安市| 宜丰县| 瓦房店市| 汤原县| 桐梓县| 镇赉县| 南宁市| 闽侯县| 虹口区| 张家界市| 宁海县| 大关县| 海安县| 汾西县| 始兴县| 日照市| 尉犁县| 双桥区| 五家渠市| 宜黄县| 甘泉县| 枣强县| 新津县|