相关疑难解决方法(0)

运行数据库连接(可能需要很长时间)时显示启动画面

我试图显示一个启动画面,而不是冻结应用程序,而它连接到数据库.正常连接(通过ADO到MSSQL)大约需要300毫秒,这不会导致主线程在窗口上显示"无响应".

但是,在(a)网络错误或(b)配置错误(无效的SQL服务器主机名/实例)的情况下,超时需要60秒.这不仅使应用程序无响应,而且在它冻结时几乎不可能显示任何错误或消息.我可以在开始连接之前弹出一条消息,但是当主线程阻塞60秒时,确实没有解决方案.

解决方案似乎是将连接移动到后台线程.这导致以下代码:

  1. 一个TThread类,它使后台连接,一些SyncObj就像一个TEvent,用于将信号发送回主线程.

  2. 使用此代码的主线程中的循环:

    BackgroundThread.StartConnecting;
    while not BackgroundThread.IsEventSignalled do begin
       Application.ProcessMessages; // keep message pump alive.
    end;
    // continue startup (reports error if db connection failed)
    
    Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?我的犹豫涉及上述解决方案的以下要素:

答:我会调用Application.ProcessMessages,我认为这是极端的代码味道.(这可能是这个规则允许的例外)

B.我在应用程序启动时引入了线程,我担心引入错误.

如果任何人都有一个已知没有竞争条件的参考实现,那可以与ADO建立后台连接,并且已知这是一种安全的方法,这将非常有用.否则一般提示或部分例子都是好的.

delphi multithreading ado

5
推荐指数
1
解决办法
1191
查看次数

在最大化丢失指定值之前动态分配表单大小

我有一个应用程序,它最初总是以最大化的方式启动。这包括推杆Self.WindowState := wsMaximized;OnCreate主窗体的。

在此之前,如果用户要将窗口状态更改为wsNormal.

所以,简而言之,主窗体的OnCreate处理程序看起来像:

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Width:= 1300;
  Height:= 800;
  WindowState:= wsMaximized;
end;
Run Code Online (Sandbox Code Playgroud)

从理论上讲,我可以在设计时分配这些维度,而这正是我所需要的。但是,由于我的屏幕和 IDE 的大小,如果不滚动,整个表单一目了然。在设计中,我保持表格尺寸小,所以我可以看到一切。但是在运行时,我需要分配这些默认尺寸,然后默认最大化。当用户将窗口状态更改为最大化时,我希望它会转到我动态分配的那些维度。

问题是它在最大化表单后似乎丢失了这些尺寸,并且它恢复到设计时的任何值。如果我注释掉该行,WindowState:= wsMaximized;那么它会以所需的默认尺寸显示表单。但是,最大化它似乎会覆盖并忽略我刚刚在它之前分配的这些值。

如何创建和显示默认最大化的主窗体,同时动态分配默认大小,而不会丢失分配的值?

delphi vcl windows-10 delphi-10.1-berlin

3
推荐指数
1
解决办法
404
查看次数