Delphi中的DLL,Form和Thread(all in one)问题

mrt*_*dnz 3 forms delphi dll multithreading

我尝试构建一个非常复杂的应用程序.

我创建了一个DLL库.我在其中放了一个表格,然后在其中放入一个主题.

在DLL我有一个功能:

procedure ShowForm; stdcall;
var
Form1 : TFormSNVFL7;
begin
  Form1 := TFormSNVFL7.Create(nil);
  Form1.Show;
end;
Run Code Online (Sandbox Code Playgroud)

我创建一个表单并显示它.这里没有问题.我给这个dll添加了一个线程.我在表格上放了一个计时器.几秒钟后,我创建一个线程并运行它.一切都很正常但是当我试图改变形式的任何东西时,什么也没发生.

在同步功能中,我尝试更改它上面的标签,但没有任何反应.

这是文件:

DLL pas:

library uploader;

uses
  SysUtils,
  Classes,
  Forms,
  UploaderForm in 'UploaderForm.pas' {FormUploader},
  ThreadUpload in 'ThreadUpload.pas';

{$R *.res}

procedure ShowForm; stdcall;
var
  upForm: TFormUploader;
begin
  upForm := TFormUploader.Create(nil);
  upForm.Show;
end;

exports
ShowForm;

begin
end.
Run Code Online (Sandbox Code Playgroud)

表格:

unit UploaderForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, acPNG, ExtCtrls, JvExExtCtrls, JvImage, JvExControls, JvLabel,
  JvAnimatedImage, JvGIFCtrl, ComCtrls, JvExComCtrls, JvProgressBar, StdCtrls,
  FileCtrl, JvDriveCtrls;

type
  TFormUploader = class(TForm)
    imgRunning: TJvImage;
    imgReady: TJvImage;
    imgUpdate: TJvImage;
    JvLabel1: TJvLabel;
    JvLabel2: TJvLabel;
    imgConnect: TJvImage;
    imgUpload: TJvImage;
    imgCheck: TJvImage;
    JvLabel3: TJvLabel;
    JvLabel4: TJvLabel;
    JvLabel5: TJvLabel;
    JvLabel6: TJvLabel;
    imgRun: TJvImage;
    imgOK: TJvImage;
    imgDone: TJvImage;
    JvProgressBar1: TJvProgressBar;
    JvLabel7: TJvLabel;
    fileList: TJvFileListBox;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormUploader: TFormUploader;

implementation

{$R *.dfm}

Uses ThreadUpload;

procedure TFormUploader.FormCreate(Sender: TObject);
begin
imgUpdate.Picture := imgReady.Picture;
imgConnect.Picture := imgReady.Picture;
imgUpload.Picture := imgReady.Picture;
imgCheck.Picture := imgReady.Picture;
imgRun.Picture := imgReady.Picture;
imgOK.Picture := imgReady.Picture;
fileList.Directory := ExtractFilePath(Application.ExeName) + 'csvexport/';
end;

procedure TFormUploader.Timer1Timer(Sender: TObject);
var
UpThread: TThread;
begin
Timer1.Enabled := False;

UpThread := UploadThread.Create(true);
UpThread.Create;
UpThread.Resume;

end;

end.
Run Code Online (Sandbox Code Playgroud)

线程:

unit ThreadUpload;

interface

uses
  Classes, UploaderForm;

type
  UploadThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

{ UploadThread }

procedure UploadThread.Execute;
begin
  With FormUploader do
  begin
    imgUpdate.Picture := imgRunning.Picture;
  end;
end;

end.
Run Code Online (Sandbox Code Playgroud)

我无法解决这个问题.

Rem*_*eau 7

TThread.Synchronize()默认情况下在DLL中不起作用,因为Synchronize()发布到的同步队列对于调用它的可执行文件是本地的.换句话说,当Synchronize()应用程序调用它时,它会发布到exe文件本地的队列.当Synchronize()由DLL调用时,它会发布到dll文件本地的队列.当应用程序在空闲时间泵送其同步队列时,它不会自动泵送DLL的队列.您必须从DLL导出一个函数,您的应用程序可以在需要时调用该函数,例如在TApplication.OnIdle事件中或在计时器中.然后,导出的函数可以调用RTL的CheckSynchronize()函数来抽取DLL的同步队列.