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)
我无法解决这个问题.
TThread.Synchronize()
默认情况下在DLL中不起作用,因为Synchronize()
发布到的同步队列对于调用它的可执行文件是本地的.换句话说,当Synchronize()
应用程序调用它时,它会发布到exe文件本地的队列.当Synchronize()
由DLL调用时,它会发布到dll文件本地的队列.当应用程序在空闲时间泵送其同步队列时,它不会自动泵送DLL的队列.您必须从DLL导出一个函数,您的应用程序可以在需要时调用该函数,例如在TApplication.OnIdle
事件中或在计时器中.然后,导出的函数可以调用RTL的CheckSynchronize()
函数来抽取DLL的同步队列.
归档时间: |
|
查看次数: |
2749 次 |
最近记录: |