- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在响应生成器之后做一些工作。
为了不耽误时间响应,我尝试在线程中完成这项工作。
该线程创建一个 DataModule,并执行某些操作(发送电子邮件、处理文件操作等),但执行会阻塞主线程。
我不使用变量或与主线程进行任何其他交互。我没有看到任何可以发出区 block 的东西。
有人可以帮忙吗?
线程代码:
<小时/>unit wdm_Thread;
interface
uses
System.SysUtils, System.Classes, Web.HTTPApp, Web.HTTPProd, Web.DSProd,Data.DB, Data.Win.ADODB;
type
TwdmThread = class(TDataModule)
dbConnection: TADOConnection;
spVisualizador: TADOStoredProc;
spVisualizadorProc: TADOStoredProc;
spVisualizadorProcFim: TADOStoredProc;
spVisualizadorProcInicio: TADOStoredProc;
ppVisualizadorOn: TDataSetPageProducer;
spVisualizadorMiniProc: TADOStoredProc;
end;
colaboreThread = class(TThread)
private
FDataModule: TwdmThread;
FPreviewPath: String;
FSessionID: String;
FUniqueID: String;
FUniqueIDVersao: String;
public
procedure Execute(); override;
class procedure Thumbnail(APreviewPath, ASessionID, AUniqueID, AUniqueIDVersao: String);
end;
implementation
uses
WinAPI.Windows, WinAPI.ActiveX;
{%CLASSGROUP 'System.Classes.TPersistent'}
{$R *.dfm}
{ threadThumbnail }
procedure colaboreThread.Execute;
begin
try
FDataModule := TwdmThread.Create(nil);
with FDataModule do
begin
spVisualizador.Parameters[1].Value := FSessionID;
spVisualizador.Parameters[2].Value := FUniqueID;
spVisualizador.Parameters[3].Value := FUniqueIDVersao;
spVisualizador.Parameters[4].Value := False;
spVisualizador.Open();
if spVisualizador.RecordCount > 0 then
try
DeleteFile(PWideChar(FPreviewPath + FUniqueIDVersao + spVisualizador.FieldByName('Extensao').AsString));
CopyFile(PWideChar(spVisualizador.FieldByName('ArmazenamentoCaminho').AsString + FUniqueIDVersao), PWideChar(FPreviewPath + FUniqueIDVersao + spVisualizador.FieldByName('Extensao').AsString), true);
spVisualizadorMiniProc.Parameters[1].Value := FSessionID;
spVisualizadorMiniProc.Parameters[2].Value := FUniqueID;
spVisualizadorMiniProc.Parameters[3].Value := FUniqueIDVersao;
spVisualizadorMiniProc.Parameters[4].Value := FPreviewPath;
spVisualizadorMiniProc.ExecProc();
finally
DeleteFile(PWideChar(FPreviewPath + FUniqueIDVersao + spVisualizador.FieldByName('Extensao').AsString));
end
end;
finally
FreeAndNil(FDataModule);
end;
end;
class procedure colaboreThread.Thumbnail(APreviewPath, ASessionID, AUniqueID, AUniqueIDVersao: String);
begin
with colaboreThread.Create(True) do
begin
FreeOnTerminate := True;
FPreviewPath := APreviewPath;
FSessionID := ASessionID;
FUniqueID := AUniqueID;
FUniqueIDVersao := FUniqueIDVersao;
if FUniqueIDVersao = '' then FUniqueIDVersao := FUniqueID;
Execute();
end;
end;
initialization
CoInitializeEx(NIL, COINIT_MULTITHREADED or COINIT_SPEED_OVER_MEMORY);
end.
WebModule 实现:
<小时/>...
procedure TwdmColaboreUP.wdmTopWebUploadwaiUploadAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
colaboreThread.Thumbnail(FPreviewPath, FSessionID, FArquivoUniqueID, FArquivoUniqueIDVersao);
end;
...
最佳答案
您正在线程上调用Execute
,但不应直接调用它。您可以使用 Resume
启动线程(或通过在其构造函数中省略 Suspending 参数)。然后,Execute 方法将在后台启动。
如果您像现在一样开始执行自己的操作,它将像任何其他方法一样在主线程中运行。
with colaboreThread.Create(True) do
begin
FreeOnTerminate := True;
FPreviewPath := APreviewPath;
FSessionID := ASessionID;
FUniqueID := AUniqueID;
FUniqueIDVersao := FUniqueIDVersao;
if FUniqueIDVersao = '' then FUniqueIDVersao := FUniqueID;
// Execute(); <--- Not this
Resume; // <--- but this
end;
关于multithreading - Delphi WebBroker/ISAPI 与线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13522460/
我需要一些帮助来接受 Delphi XE2 中 ISAPI 上的文件上传。在 Delphi 2007 中,我使用 Shiv 的 TMsMultipartParser,它 100% 工作。尝试在 XE2
我正在尝试在响应生成器之后做一些工作。 为了不耽误时间响应,我尝试在线程中完成这项工作。 该线程创建一个 DataModule,并执行某些操作(发送电子邮件、处理文件操作等),但执行会阻塞主线程。 我
我有一个使用 Delphi (2009) Web Broker 构建的相当简单的网络应用程序。我正在尝试(但失败了)将 Javascript 输出到页面。 我需要输出的javascript在页面正文中
我可以为网上经纪服务网页/应用程序创建一个干净的 URL 吗? 典型的网上经纪商 URL 通常如下所示: hxxp://www.mywebsite.com/myapp.dll?name=fred 或
我有一个包含 nvarchar 数据的 MS SQL Server 数据库,特别是其中包含“★ABC★”的数据字段。我的 Delphi 桌面应用程序显示得很好,但来自 Delphi XE4 中使用 T
您能给我一些关于如何仅使用网络代理来实现休息网络服务器的提示吗? 我知道较新版本的 delphi 具有 REST/JSON/DATASNAP 功能,但我坚持使用 BDS2006。 基本上,我需要与其他
我是一名优秀的程序员,十分优秀!