Delphi 7: Как реализовать многопоточность? - PullRequest
1 голос
/ 09 марта 2012

У меня есть TButton в основной TForm. Когда пользователь нажимает кнопку, он выполняет следующий процесс:

begin
  Process_done := FALSE;

  Process_Result.Clear;

  cmdProcess.CommandLine := #34+AppPath+'getdata.exe"';

  cmdProcess.Run;

  Repeat
    Application.ProcessMessages;
  Until Process_done;
end;

Как вы можете видеть выше, процесс вызывает внешний исполняемый файл, и процесс может несколько раз блокировать основное приложение.

Это только один процесс, и мне нужен еще один.

Итак, я думаю о реализации многопоточности, где я могу запустить вышеуказанный процесс в отдельном потоке. Другой процесс также. И основной поток может что-то сделать, проверяя, когда оба процесса завершены.

Кто-нибудь может дать мне несколько примеров, как это сделать с помощью Delphi 7?

ИЛИ указать мне статью, простую реализацию, подобную этой?

Спасибо.

Ответы [ 2 ]

12 голосов
/ 09 марта 2012

Попробуйте что-то вроде этого:

type
  TRunProcessThread = class(TThread)
  protected
    cmdProcess: Whatever;
    procedure Execute; override;
  public
    constructor Create(const ACmdLine: String);
    destructor Destroy; override;
  end;

constructor TRunProcessThread.Create(const ACmdLine: String);
begin
  inherited Create(True);
  FreeOnTerminate := True;
  cmdProcess := Whatever.Create;
  cmdProcess.CommandLine := ACmdLine;
end;

destructor TRunProcessThread.Destroy;
begin
  cmdProcess.Free;
  inherited;
end;

procedure TRunProcessThread.Execute;
begin
  cmdProcess.Run;
  ...
end;

.

procedure TForm1.Button1Click(Sender: TObject);
var
  Thread: TRunProcessThread;
begin
  Thread := TRunProcessThread.Create(AnsiQuotedStr(AppPath + 'getdata.exe', #34));
  Thread.OnTerminate := ProcessDone;
  Thread.Resume;
end;

procedure TForm1.ProcessDone(Sender: TObject);
begin
  // access TRunProcessThread(Sender) to get result information as needed ...
end;
0 голосов
/ 09 марта 2012

Вы должны создать класс, унаследованный от TThread, и поместить этот код туда.Я точно не помню, но я думаю, что вы найдете шаблон TThread в диалоговом окне Файл-> Новый.Когда выполнение кода закончено, вы просто уведомляете свой графический интерфейс.Вот статья, как синхронизировать интерфейс с внешним потоком http://delphi.about.com/od/kbthread/a/thread-gui.htm

...