我正在试着在一个反应制作人之后做些工作。
为了不保存时间响应,我尝试在线程中完成这项工作。
这个线程创建一个DataModule,并执行某些事情(发送电子邮件、处理文件操作等),但是执行阻塞了主线程。
我不使用变量或与主线程的任何其他交互。我看不出有什么东西能发出信号。
有人能帮忙吗?
线程代码:
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;
...发布于 2012-11-23 12:02:28
您正在线程上调用Execute,但不应该直接调用它。使用Resume启动线程(或者在其构造函数中省略挂起的参数)。然后,执行方法将在后台启动。
如果您像现在一样开始执行,它将像其他任何方法一样在主线程中运行。
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; https://stackoverflow.com/questions/13522460
复制相似问题