2012-03-09 106 views
1

我在主TForm中有一个TButton。当用户点击该按钮,将执行以下过程:Delphi 7:如何实现多线程?

begin 
    Process_done := FALSE; 

    Process_Result.Clear; 

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

    cmdProcess.Run; 

    Repeat 
    Application.ProcessMessages; 
    Until Process_done; 
end; 

正如你可以在上面看到,该进程调用外部可执行文件,并且该过程可能需要一些时间,这阻止主应用程序。

这只是一个过程,而我需要另一个过程。

所以,我想实现多线程,我可以在单独的线程中运行上述过程。另一个过程也是如此。当两个进程完成时,主线程可以执行某些操作。

任何人都可以给我一些例子如何使用Delphi 7做到这一点?

或指向我的文章,这样的简单实现?

谢谢。

回答

11

尝试这样同步:

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

谢谢!这就是我实际需要的:) – ewlung 2012-03-09 10:03:02

+7

现在你已经足够了解了很多麻烦,但还不足以脱身。但是,没有更好的学习方法(我知道),然后体验线程,竞争条件,死锁,资源争用以及VCL的非线程安全特性的乐趣,而不是亲自体验它。你刚刚跳下兔子洞。它非常深入。 – 2012-03-10 17:06:13

0

您应该创建一个从TThread继承的类并将该代码放在那里。我不记得确切,但我想你会在File-> New对话框中找到TThread模板。代码执行完成后,您只需通知您的gui。这里有一个文章如何UI带外螺纹http://delphi.about.com/od/kbthread/a/thread-gui.htm