Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 在几秒钟内,显示飞溅图像是空白的_Performance_Delphi_Splash Screen - Fatal编程技术网

Performance 在几秒钟内,显示飞溅图像是空白的

Performance 在几秒钟内,显示飞溅图像是空白的,performance,delphi,splash-screen,Performance,Delphi,Splash Screen,在我的应用程序中,在连接到数据库和其他初始化过程中,我有一个splash映像。它可以很好地显示飞溅图像,但在那里它是空白的一段时间。 所以 加载飞溅图像并在几分之一秒的时间内显示 飞溅图像在2-3秒内变为空白 飞溅图像在几秒钟后再次显示 喷溅关闭 P>是否有一个聪明的东西,就是尽可能快地显示图像,去除空白图像? DPR文件中的代码: Application.Initialize; SplashForm := TSplashForm.Create(Application); SplashFor

在我的应用程序中,在连接到数据库和其他初始化过程中,我有一个splash映像。它可以很好地显示飞溅图像,但在那里它是空白的一段时间。 所以

  • 加载飞溅图像并在几分之一秒的时间内显示
  • 飞溅图像在2-3秒内变为空白
  • 飞溅图像在几秒钟后再次显示
  • 喷溅关闭 <> P>是否有一个聪明的东西,就是尽可能快地显示图像,去除空白图像?

    DPR文件中的代码:

    Application.Initialize;
    
    SplashForm := TSplashForm.Create(Application);
    SplashForm.Show;
    // Tried Splash.Update here but no difference.
    
    SplashForm.SetPos(15);
    // Init code
    SplashForm.SetPos(30);
    
    // More Init code
    SplashForm.SetPos(100);
    
    SplashForm.Close;
    
    Application.Run;
    
    和飞溅装置:

    procedure TSplashForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
    end;
    
    procedure TSplashForm.FormCreate(Sender: TObject);
    begin
      pbLoading.Properties.Text := 'Loading ' + TClientConfig.Instance.AppTitle + '...';
    end;
    
    procedure TSplashForm.SetPos(aPos: Integer);
    begin
      pbLoading.Position := aPos;
      UpDate;
    end;
    
    问候
    罗兰

    您的SplashForm需要接收WM_PAINT消息才能显示自己,除非消息泵正在工作,否则这不会发生


    Application.ProcessMessages
    放在
    SplashForm.Show

    之后可能不是很明显,但是您的代码显示启动屏幕,然后立即关闭它。如果你把写着“SplashForm.Close”的那行注释掉会发生什么?

    我想我现在明白了。我的应用程序使用粗体,加载模型需要几秒钟。在这段时间内,飞溅物是空白的。我设法减少了一点时间,但我不想用Application.ProcessMessages将粗体SetFromModel的内部内容弄乱

    我觉得这样可以。但是谢谢你的评论。它为我指明了正确的方向


    /罗兰

    实际上Update()将同步执行相同的操作。此时消息循环已经存在,但VCL线程没有机会绘制已经无效的窗口。谢谢。听起来不错,但没什么区别。似乎有些事情需要很长时间才能清除splashimage。ProcessMessages()不会等待。HandleMessage()does@Worm
    Application.ProcessMessages
    是同步的。它将队列抽到空,然后返回。@Roland,您是否在SetPos方法之后(或在SetPos方法中)添加了
    ProcessMessages
    ?我已将代码简化了一点。初始化代码后面有一个对DatamoduleCreate的调用。这将加载模型并需要一些时间。我想在这一切结束后关闭飞溅。@Roland您取出的代码是让我们能够解决问题的关键部分!!