我的Java方面博客

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

          常用鏈接

          統(tǒng)計

          最新評論

          PostMessage和SendMessage區(qū)別

          PostMessage 只是把消息放入隊列,不管其他程序是否處理都返回,然后繼續(xù)執(zhí)行 ;
          SendMessage 必須等待其他程序處理消息后才返回,繼續(xù)執(zhí)行。
          PostMessage
          的返回值表示 PostMessage 函數(shù)執(zhí)行是否正確 ;
          SendMessage 的返回值表示其他程序處理消息后的返回值。
          使用這兩個發(fā)送消息函數(shù)的最重要的是要看你的程序是否要對消息的滯后性關(guān)注否 ,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
              
          //消息處理內(nèi)容
              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編程


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 察隅县| 分宜县| 普兰县| 永康市| 调兵山市| 金沙县| 孟连| 丰城市| 宜兰市| 卫辉市| 怀集县| 墨脱县| 峨山| 山西省| 集贤县| 定兴县| 凤山市| 安康市| 贵港市| 广汉市| 肇东市| 库车县| 京山县| 五台县| 曲阳县| 江西省| 浪卡子县| 怀远县| 泽库县| 商河县| 彭水| 高安市| 南江县| 建湖县| 宁陵县| 东兰县| 云安县| 开阳县| 麻栗坡县| 石泉县| 江口县|