首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TThread上创建MainForm

在TThread上创建MainForm
EN

Stack Overflow用户
提问于 2021-02-18 06:49:18
回答 1查看 114关注 0票数 3

我有一个Delphi2010应用程序,它导出一个动态链接库并具有library头文件。它在TThread中创建自己的MainForm,如下所示:

代码语言:javascript
复制
var
  ActiveThread: TActive;
  
type
  TActive= class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TActive.Execute;
begin
      Application.Initialize;
      Application.CreateForm(MyForm, form);
      Application.Run;
end;

begin
  ActiveThread := TActive.Create(true);
  ActiveThread.FreeOnTerminate := true;
  ActiveThread.Resume;
end.

每当我通过LoadLibrary函数加载这个DLL时,应用程序都运行得很好。(显然,它使用我传递给LoadLibrary的线程作为主线程,没有任何问题)

但是,如果我试图通过在Options ->应用程序中更改生成的输出来将此DLL导出为实际的EXE。并将标题从library更改为program,然后构建它并执行输出EXE而不是通过windows api加载DLL,应用程序在尝试创建表单时挂起,特别是在Application.CreateForm(MyForm, form);。如果我从线程中删除应用程序初始化,并将其放在main例程中,它就会运行得很好。

我试图呈现的表单只是一个空表单。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-18 07:28:21

当将这段代码编译为program时,它将在运行时尝试在到达end.时自行终止,甚至在工作线程有机会运行之前,这可能(也很可能)发生在Application对象被销毁之后。在让程序退出之前,您必须等待工作线程完成其工作,例如:

代码语言:javascript
复制
program MyProgram;

uses
  Classes, Forms, MyForm;

type
  TActive = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TActive.Execute;
begin
  Application.Initialize;
  Application.CreateForm(TMyForm, MyForm);
  Application.Run;
end;

var
  ActiveThread: TActive;
begin
  ActiveThread := TActive.Create(False);
  ActiveThread.WaitFor;
  ActiveThread.Free;
end.

但是,真的没有充分的理由使用这样的工作线程,这违背了使用线程的全部目的,所以你最好干脆干脆把它去掉:

代码语言:javascript
复制
program MyProgram;

uses
  Forms, MyForm;

begin
  Application.Initialize;
  Application.CreateForm(TMyForm, MyForm);
  Application.Run;
end.

另一方面,如果您试图在programlibrary项目之间共享公共代码,那么您可以将Application代码包装在函数中,并让项目决定哪个线程调用该函数,例如:

代码语言:javascript
复制
unit MyApp;

interface

procedure RunMyApp;

implementation

uses
  Forms, MyForm;

procedure RunMyApp;
begin
  Application.Initialize;
  Application.CreateForm(TMyForm, MyForm);
  Application.Run;
end;

end.
代码语言:javascript
复制
program MyProgram;

uses
  MyApp;

begin
  RunMyApp;
end.
代码语言:javascript
复制
library MyLibrary

uses
  Classes, MyApp;
  
type
  TActive = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TActive.Execute;
begin
  RunMyApp;
end;

var
  ActiveThread: TActive;
begin
  ActiveThread := TActive.Create(True);
  ActiveThread.FreeOnTerminate := True;
  ActiveThread.Resume;
end.
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66251082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档