首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi WebBroker / ISAPI与线程

Delphi WebBroker / ISAPI与线程
EN

Stack Overflow用户
提问于 2012-11-23 02:37:15
回答 1查看 1.1K关注 0票数 3

我正在试着在一个反应制作人之后做些工作。

为了不保存时间响应,我尝试在线程中完成这项工作。

这个线程创建一个DataModule,并执行某些事情(发送电子邮件、处理文件操作等),但是执行阻塞了主线程。

我不使用变量或与主线程的任何其他交互。我看不出有什么东西能发出信号。

有人能帮忙吗?

线程代码:

代码语言:javascript
复制
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实现:

代码语言:javascript
复制
...

procedure TwdmColaboreUP.wdmTopWebUploadwaiUploadAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);  
begin  
  colaboreThread.Thumbnail(FPreviewPath, FSessionID, FArquivoUniqueID, FArquivoUniqueIDVersao);  
end;  

...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-23 12:02:28

您正在线程上调用Execute,但不应该直接调用它。使用Resume启动线程(或者在其构造函数中省略挂起的参数)。然后,执行方法将在后台启动。

如果您像现在一样开始执行,它将像其他任何方法一样在主线程中运行。

代码语言:javascript
复制
  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;  
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13522460

复制
相关文章

相似问题

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