DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: Odmfkqe
今日帖子: 18
在线用户: 18
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 tuesdays (Tuesday) ▲▲▲△△ -
注册会员
2019/12/3 16:57:51
标题:
为什么我的代码会卡死界面?  ProcessMessages已经加上了.. 浏览:559
加入我的收藏
楼主: unit Unit9;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, qworker, Vcl.StdCtrls, Vcl.Buttons;

type
  TForm9 = class(TForm)
    BitBtn1: TBitBtn;
    btn1: TBitBtn;
    mmo1: TMemo;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure Test(AData: Pointer);
    procedure delay(MSecs: LongInt);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form9: TForm9;
  //vwo:TQWorkers;
implementation

{$R *.dfm}

procedure TForm9.BitBtn1Click(Sender: TObject);
begin
   ShowMessage(IntToStr( Workers.Post(procedure (ajob:PQJob)begin
      repeat
        RunInMainThread(Test, Pointer(0));
        delay(5*1000);
      until (Application.Terminated);

      ShowMessage(BoolToStr(Workers.Terminating, true));
      ShowMessage(BoolToStr(ajob.IsTerminated, true));
      //
   end, Pointer(0), False ,jdfFreeByUser) ));
end;

 procedure TForm9.Test(AData: Pointer);
 begin
    // 首次卡死界面?
    // 移动界面会经常卡死?
    mmo1.Lines.Add(TimeToStr(Now()));
    Caption := TimeToStr(Now());
    delay(5*1000);
 end;

procedure TForm9.FormCreate(Sender: TObject);
begin
    Workers.MaxWorkers := 99;
end;

procedure TForm9.delay(MSecs:LongInt);
var
  FirstTickCount,Now:LongInt;
begin
  FirstTickCount:=GetTickCount();
  repeat
    Application.ProcessMessages;
    Now:=GetTickCount();
  until (Now - FirstTickCount >=MSecs)or(Now<FirstTickCount);
end;

end.
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 ly_212002 (舅子哥) ★☆☆☆☆ -
盒子活跃会员
2019/12/3 17:53:00
1楼: 焦点聚焦到这个接口 RunInMainThread
----------------------------------------------
设计是我生命中的一部分
作者:
男 tuesdays (Tuesday) ▲▲▲△△ -
注册会员
2019/12/4 9:45:05
2楼: @ ly_212002 (舅子哥)

procedure RunInMainThread(AProc: TMainThreadProc; AData: Pointer); overload;
var
  AHelper: TRunInMainThreadHelper;
begin
  AHelper := TRunInMainThreadHelper.Create;
  AHelper.FProc := AProc;
  AHelper.FData := AData;
  try
    TThread.Synchronize(nil, AHelper.Execute);
  finally
    FreeObject(AHelper);
  end;
end;

procedure RunInMainThread(AProc: TMainThreadProcG; AData: Pointer); overload;
var
  AHelper: TRunInMainThreadHelper;
begin
  AHelper := TRunInMainThreadHelper.Create;
  TMethod(AHelper.FProc).Code := @AProc;
  TMethod(AHelper.FProc).Data := nil;
  AHelper.FData := AData;
  try
    TThread.Synchronize(nil, AHelper.Execute);
  finally
    FreeObject(AHelper);
  end;
end;

看不懂.
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 tuesdays (Tuesday) ▲▲▲△△ -
注册会员
2019/12/4 16:39:06
3楼: 继续求助....
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 grjs_2004 (grjsITname) ★☆☆☆☆ -
盒子活跃会员
2019/12/4 17:59:18
4楼:     Application.ProcessMessages;
    是与Application.Terminate;搭配使用的,而不是
    Application.Terminated;
----------------------------------------------
Everyone will to do best!
作者:
男 jackalan (nVicen) ★☆☆☆☆ -
盒子活跃会员
2019/12/5 9:30:51
5楼: TThread.Synchronize(nil, AHelper.Execute);
你这个线程整个就在主线程里执行,和没用线程有区别?
----------------------------------------------
简单做人,认真做事。
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行35.15625毫秒 RSS