zoukankan      html  css  js  c++  java
  • 简单窗体振动

    Thread
    {*******************************************************}
    {                                                       }
    {       Delphi Thread Sample                            }                            
    {       Creation Date 2012.08.25                        }
    {       Created By: ming                                }
    {                                                       }
    {*******************************************************}
    unit unitWorkThread;
    
    interface
    
    uses
      Classes,Windows, Messages, SysUtils, Graphics, StdCtrls, Controls, DateUtils;
    
    const
      WM_UPDATE  = WM_USER + $100;
      WM_LEFT    = WM_USER + $101;
      WM_RIGHT   = WM_USER + $102;
      WM_TOP     = WM_USER + $103;
      WM_BOTTOM  = WM_USER + $104;
      WM_DEFAULT = WM_USER + $105;
    
    type
      TWorkThread = class(TThread)
      private
        { Private declarations }
        FEvent,FMainFormHWND: HWND;
        FDoTimes,FTickTimes: Integer;
        FMsg: string;
        FMemo:  TMemo;
        FInterval: Cardinal;
        procedure doSyncProc1;
        procedure doSomething;
        procedure syncOutputMsg;
        procedure doOutputMsg(const msg: string);
        procedure _sleep(millisecond:Cardinal);
      protected
        procedure Execute; override;
      public
        constructor Create(Suspend: boolean); overload;
        constructor Create(Suspend: boolean; mmoOutput: TMemo); overload;
        destructor Destroy; override;
      public
        procedure exitThread;
      public
        property Interval:Cardinal read FInterval write FInterval;
        property MainFormHWND: HWND read FMainFormHWND write FMainFormHWND;
        property DoTimes:Integer read FDoTimes write FDoTimes;
      end;
    
    var
      WorkThread: TWorkThread;
    
    implementation
    
    { TWorkThread }
    
    constructor TWorkThread.Create(Suspend: boolean);
    begin
      inherited Create(Suspend);
      FEvent := CreateEvent(nil,False,False,nil);
      FreeOnTerminate := True;
      FInterval := 100;
    end;
    
    constructor TWorkThread.Create(Suspend: boolean; mmoOutput: TMemo);
    begin
      inherited Create(Suspend);
      FEvent := CreateEvent(nil,False,False,nil);
      FreeOnTerminate := True;
      FInterval := 100;  
      FMemo := mmoOutput;
      doOutputMsg('Thread Create');
    end;
    
    destructor TWorkThread.Destroy;
    begin
      CloseHandle(FEvent);
      doOutputMsg('Thread Destroy');
      inherited;
    end;
    
    procedure TWorkThread.doSyncProc1;
    begin
    
    end;
    
    procedure TWorkThread.doOutputMsg(const msg: string);
    begin
      FMsg := msg;
      Synchronize(syncOutputMsg);
    end;
    
    procedure TWorkThread.syncOutputMsg;
    begin
      if Assigned(FMemo) then
        FMemo.Lines.Add(FMsg);
    end;
    
    procedure TWorkThread.doSomething;
    const
      K_SLEEP = 20;
    begin
      SendMessage(FMainFormHWND,WM_LEFT,0,0); _Sleep(K_SLEEP);
      SendMessage(FMainFormHWND,WM_DEFAULT,0,0);
    
      SendMessage(FMainFormHWND,WM_RIGHT,0,0); _Sleep(K_SLEEP);
      SendMessage(FMainFormHWND,WM_DEFAULT,0,0);
    
      SendMessage(FMainFormHWND,WM_TOP,0,0);   _Sleep(K_SLEEP);
      SendMessage(FMainFormHWND,WM_DEFAULT,0,0);
    
      SendMessage(FMainFormHWND,WM_BOTTOM,0,0); _Sleep(K_SLEEP);
      SendMessage(FMainFormHWND,WM_DEFAULT,0,0);
    
      Inc(FTickTimes);
      if FTickTimes >= FDoTimes then
      begin
        FTickTimes := 0;
        Self.Suspend;
      end;
    end;
    
    procedure TWorkThread.Execute;
    begin
      inherited;
      while not Terminated do
      begin
        if WaitForSingleObject(FEvent,FInterval)=WAIT_OBJECT_0 then
        begin
          Break;
        end;
        doSomething;
      end;
    end;
    
    procedure TWorkThread.exitThread;
    begin
      if FEvent>0 then
      begin
        SetEvent(FEvent);
        if Suspended then Resume;
      end;
    end;
    
    procedure TWorkThread._sleep(millisecond: Cardinal);
    begin
      WaitForSingleObject(Self.Handle,millisecond);
    end;
    
    {=============================================================}
    { Use TWorkThread
    procedure TForm1.btnCreateThreadClick(Sender: TObject);
    begin
      WorkThread := TWorkThread.Create(False,mmoOutput);
      //WorkThread.Interval := 1000;
      if WorkThread.Suspended then
        WorkThread.Resume;
    end;
    
    procedure TForm1.btnDestroyThreadClick(Sender: TObject);
    begin
      if Assigned(WorkThread) then  
        WorkThread.exitThread;
    end;
    }
    
    end.
    Main Form
    unit unitMain;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, unitWorkThread{Thread};
    
    type
      TfrmMain = class(TForm)
        btnStart: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure btnStartClick(Sender: TObject);
      private
        { Private declarations }
        FDestWindow: HWND;
        FOriginalRect: TRect;
        procedure DefaultPostion;
        procedure GoLeft;
        procedure GoRight;
        procedure GoTop;
        procedure GoBottom;
      protected
        procedure OnLeft(var aMag: TMessage); message WM_LEFT;
        procedure OnRight(var aMag: TMessage); message WM_RIGHT;
        procedure OnTop(var aMag: TMessage); message WM_TOP;
        procedure OnBottom(var aMag: TMessage); message WM_BOTTOM;
        procedure OnDefault(var aMag: TMessage); message WM_DEFAULT;
      public
        { Public declarations }
      end;
    
    var
      frmMain: TfrmMain;
    const
      K_OFFSET = 2;
    
    implementation
    
    {$R *.dfm}
    
    { TfrmMain }
    
    procedure TfrmMain.defaultPostion;
    begin
      SetWindowPos(FDestWindow,HWND_TOP,FOriginalRect.Left,FOriginalRect.Top,0,0,SWP_NOSIZE);
    end;
    
    procedure TfrmMain.OnDefault(var aMag: TMessage);
    begin
      defaultPostion;
    end;
    
    procedure TfrmMain.GoBottom;
    begin
      SetWindowPos(FDestWindow,HWND_TOP,FOriginalRect.Left,FOriginalRect.Top - K_OFFSET,0,0,SWP_NOSIZE);
    end;
    
    procedure TfrmMain.GoLeft;
    begin
      SetWindowPos(FDestWindow,HWND_TOP,FOriginalRect.Left + K_OFFSET,FOriginalRect.Top,0,0,SWP_NOSIZE);
    end;
    
    procedure TfrmMain.GoRight;
    begin
      SetWindowPos(FDestWindow,HWND_TOP,FOriginalRect.Left - K_OFFSET,FOriginalRect.Top,0,0,SWP_NOSIZE);
    end;
    
    procedure TfrmMain.GoTop;
    begin
      SetWindowPos(FDestWindow,HWND_TOP,FOriginalRect.Left,FOriginalRect.Top + K_OFFSET,0,0,SWP_NOSIZE);
    end;
    
    procedure TfrmMain.OnBottom(var aMag: TMessage);
    begin
      GoBottom;
    end;
    
    procedure TfrmMain.OnLeft(var aMag: TMessage);
    begin
      GoLeft;
    end;
    
    procedure TfrmMain.OnRight(var aMag: TMessage);
    begin
      GoRight;
    end;
    
    procedure TfrmMain.OnTop(var aMag: TMessage);
    begin
      GoTop;
    end;
    
    procedure TfrmMain.FormCreate(Sender: TObject);
    begin
      Self.DoubleBuffered := True;
      FDestWindow := Handle;
      GetWindowRect(FDestWindow,FOriginalRect);
      WorkThread := TWorkThread.Create(TRUE);
      WorkThread.Interval := 10;
      WorkThread.MainFormHWND := Self.Handle;
      WorkThread.DoTimes := 10;
    end;
    
    procedure TfrmMain.FormDestroy(Sender: TObject);
    begin
      if Assigned(WorkThread) then
        WorkThread.exitThread;
    end;
    
    procedure TfrmMain.btnStartClick(Sender: TObject);
    begin
      if Assigned(WorkThread) then
      begin
        if WorkThread.Suspended then
          WorkThread.Resume;
      end;
    end;
    
    end.
  • 相关阅读:
    Bellman-Ford 单源最短路径算法
    Prim 最小生成树算法
    Kruskal 最小生成树算法
    Kosaraju 算法检测有向图的强连通性
    Kosaraju 算法查找强连通分支
    不相交集合森林的启发式策略
    Union-Find 检测无向图有无环路算法
    redis的持久化方式RDB和AOF的区别
    Docker -v 对挂载的目录没有权限 Permission denied
    postgresql如何让主键自增
  • 原文地址:https://www.cnblogs.com/Jekhn/p/2656656.html
Copyright © 2011-2022 走看看