茄子在线看片免费人成视频,午夜福利精品a在线观看,国产高清自产拍在线观看,久久综合久久狠狠综合

    <s id="ddbnn"></s>
  • <sub id="ddbnn"><ol id="ddbnn"></ol></sub>

  • <legend id="ddbnn"></legend><s id="ddbnn"></s>

    Delphi線程同步(SendMessage)
    來(lái)源:易賢網(wǎng) 閱讀:1640 次 日期:2015-08-27 16:35:20
    溫馨提示:易賢網(wǎng)小編為您整理了“Delphi線程同步(SendMessage)”,方便廣大網(wǎng)友查閱!

    Delphi線程同種的方法有很多種,除了常用的Synchronize方法,也可以使用SendMessage向主窗口發(fā)送消息,因?yàn)?SendMessage是阻塞的,可以達(dá)到同步的效果。主線程可以直接定義消息類型的procedure接收消息,也可以重寫(xiě)TControl類的 WndProc窗口過(guò)程,在窗口過(guò)程里面截取自己想要的消息。

    Thread

    {*******************************************************}

    { }

    { Delphi Thread Sample 5 }

    { Creation Date 2012.12.30 }

    { Created By: ming }

    { }

    {*******************************************************}

    unit unitWorkThread;

    interface

    uses

    Classes,Windows, Messages, SysUtils, Graphics, StdCtrls;

    type

    TWorkThread = class(TThread)

    private

    { Private declarations }

    FEvent: HWND;

    FMsg: string;

    FMemo: TMemo;

    FInterval,FTickTimes,FCount: Cardinal;

    procedure doSyncProc1;

    procedure syncOutputMsg;

    procedure addLog(const msg: string); overload;

    procedure addLog(const fmtStr:string; const params: array of const); overload;

    procedure _sleep(millisecond:Cardinal);

    protected

    procedure Execute; override;

    public

    constructor Create(Suspend: boolean); overload;

    constructor Create(Suspend: boolean; mmoOutput: TMemo); overload;

    destructor Destroy; override;

    private

    FThreadPause,FThreadStop: Boolean;

    procedure doSomething;

    public

    function ThreadStart: Boolean;

    function ThreadPause: Boolean;

    function ThreadStop: Boolean;

    procedure ThreadTerminate;

    public

    MainFromHandle: HWND;

    DoUpdateUI: procedure(const value: string) of object;

    property Interval:Cardinal read FInterval write FInterval;

    end;

    const {0x0400 - 0x7FFF}

    WM_UPDATE_UI1 = WM_USER + $1001;

    WM_UPDATE_UI2 = WM_USER + $1002;

    WM_UPDATE_UI3 = WM_USER + $1003;

    var

    WorkThread: TWorkThread;

    implementation

    { TWorkThread }

    constructor TWorkThread.Create(Suspend: boolean);

    begin

    inherited Create(Suspend);

    FEvent := CreateEvent(nil,True,False,nil);

    FreeOnTerminate := True;

    FInterval := 1000;

    end;

    procedure TWorkThread.addLog(const msg: string);

    begin

    FMsg := msg;

    Synchronize(syncOutputMsg);

    end;

    procedure TWorkThread.addLog(const fmtStr: string;

    const params: array of const);

    begin

    FMsg := Format(fmtStr,params);

    Synchronize(syncOutputMsg);

    end;

    constructor TWorkThread.Create(Suspend: boolean; mmoOutput: TMemo);

    begin

    inherited Create(Suspend);

    FEvent := CreateEvent(nil,True,False,nil);

    FreeOnTerminate := True;

    FInterval := 1000;

    FMemo := mmoOutput;

    end;

    destructor TWorkThread.Destroy;

    begin

    CloseHandle(FEvent);

    inherited;

    end;

    procedure TWorkThread.doSomething;

    begin

    //addLog(FormatDateTime('c',now));

    Inc(FCount);

    FCount := FCount mod 100000;

    SendMessage(MainFromHandle,WM_UPDATE_UI1,0,FCount);

    SendMessage(MainFromHandle,WM_UPDATE_UI2,0,FCount);

    SendMessage(MainFromHandle,WM_UPDATE_UI3,0,FCount);

    // doSyncProc1;

    end;

    procedure TWorkThread.doSyncProc1;

    begin

    DoUpdateUI(IntToStr(FCount));

    end;

    procedure TWorkThread.syncOutputMsg;

    var

    dt: string;

    begin

    dt := FormatDateTime('hh:nn:ss',now);

    FMsg := Format('[%s] - ',[dt]) + FMsg;

    if Assigned(FMemo) then

    FMemo.Lines.Add(FMsg);

    end;

    procedure TWorkThread.Execute;

    begin

    inherited;

    while not Terminated do

    begin

    if WaitForSingleObject(FEvent,100)=WAIT_OBJECT_0 then

    begin

    Break;

    end;

    if (GetTickCount - FTickTimes) >= FInterval then

    try

    if not FThreadStop then

    begin

    doSomething;

    FTickTimes := GetTickCount;

    end;

    except on e:Exception do

    addLog(e.Message);

    end;

    if FThreadStop then

    Suspend;

    end;

    end;

    function TWorkThread.ThreadStart: Boolean;

    begin

    FThreadStop := False;

    if Suspended then Resume;

    end;

    function TWorkThread.ThreadPause: Boolean;

    begin

    FThreadPause := True;

    if not Suspended then Suspend;

    end;

    function TWorkThread.ThreadStop: Boolean;

    begin

    FThreadPause := False;

    FThreadStop := True;

    if Suspended then Resume;

    end;

    procedure TWorkThread.ThreadTerminate;

    begin

    FThreadStop := False;

    if FEvent>0 then

    begin

    SetEvent(FEvent);

    if Suspended then Resume;

    end;

    end;

    procedure TWorkThread._sleep(millisecond: Cardinal);

    begin

    //WaitForSingleObject(Self.Handle,millisecond);

    WaitForSingleObject(FEvent,millisecond);

    end;

    end.

    Main form

    unit main;

    interface

    uses

    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,

    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, unitWorkThread;

    type

    TfrmMain = class(TForm)

    Memo1: TMemo;

    btnStart: TButton;

    btnPause: TButton;

    btnStop: TButton;

    Edit1: TEdit;

    Edit2: TEdit;

    Edit3: TEdit;

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    procedure btnStartClick(Sender: TObject);

    procedure btnPauseClick(Sender: TObject);

    procedure btnStopClick(Sender: TObject);

    private

    { Private declarations }

    procedure UpdateUI(const value: string);

    protected

    procedure On_WM_UPDATE_UI(var msg: TMessage);message WM_UPDATE_UI1;

    procedure WndProc(var Message: TMessage); override;

    public

    { Public declarations }

    end;

    var

    frmMain: TfrmMain;

    implementation

    {$R *.dfm}

    procedure TfrmMain.btnPauseClick(Sender: TObject);

    begin

    WorkThread.ThreadPause;

    end;

    procedure TfrmMain.btnStartClick(Sender: TObject);

    begin

    WorkThread.ThreadStart;

    end;

    procedure TfrmMain.btnStopClick(Sender: TObject);

    begin

    WorkThread.ThreadStop;

    end;

    procedure TfrmMain.FormCreate(Sender: TObject);

    begin

    WorkThread := TWorkThread.Create(True,Memo1);

    WorkThread.MainFromHandle := Self.Handle;

    WorkThread.DoUpdateUI := UpdateUI;

    end;

    procedure TfrmMain.FormDestroy(Sender: TObject);

    begin

    WorkThread.ThreadTerminate;

    end;

    procedure TfrmMain.On_WM_UPDATE_UI(var msg: TMessage);

    begin

    Edit1.Text := IntToStr(msg.lParam);

    end;

    procedure TfrmMain.UpdateUI(const value: string);

    begin

    Edit1.Text := value;

    end;

    procedure TfrmMain.WndProc(var Message: TMessage);

    begin

    case Message.Msg of

    WM_UPDATE_UI2:

    begin

    Edit2.Text := IntToStr(Message.lParam);

    end;

    WM_UPDATE_UI3:

    begin

    Edit3.Text := IntToStr(Message.lParam);

    end;

    else

    inherited;

    end;

    end;

    end.

    更多信息請(qǐng)查看IT技術(shù)專欄

    更多信息請(qǐng)查看網(wǎng)絡(luò)編程
    易賢網(wǎng)手機(jī)網(wǎng)站地址:Delphi線程同步(SendMessage)
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2026上岸·考公考編培訓(xùn)報(bào)班

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)