2012-11-23 1 views
3

응답 생성자 다음에 몇 가지 작업을 시도하고 있습니다.Delphi WebBroker/ISAPI 대 스레딩

시간 응답을 보유하지 않기 위해 스레드에서이 작업을 수행하려고합니다.

이 스레드는 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; 

... 
+2

적절한 설명이나 코드없이 어떻게 추측 할 수 있습니까? – jachguate

+0

관심을 가져 주셔서 감사합니다. 나는 처음부터 코드를 넣지 않지만, 지금은 그것을했다. – adam9k

답변

3

당신은 스레드에서 Execute을 요구하고 있지만, 직접 호출해서는 안된다. Resume을 사용하여 스레드를 시작하거나 생성자에서 Suspended 매개 변수를 생략합니다. 그런 다음 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; 
+0

완벽하게 작동합니다 ... 정말 고마워요! – adam9k