求救!delphi多线程入门问题

ctjtn 2013-07-10 09:36:32
写了个多线程实例,主要代码如下:
TMyThread1 = class(TMyThread)
protected
procedure Execute;override;
procedure SetPb;
private
i_ca:Integer;
end;
procedure TMyThread1.Execute;
begin
Synchronize(SetPb);
end;
procedure TMyThread1.SetPb;
var
i:Integer;
i_cata:Integer;
begin
i_cata:=i_ca;
if i_cata=1 then
begin
Form1.pb1.Min:=0;
Form1.pb1.Max:=10000;
Form1.pb1.Position:=0;
for i:=0 to 10000 do
begin
Form1.pb1.StepBy(1);
end;
end else
begin
Form1.pb2.Min:=0;
Form1.pb2.Max:=10000;
Form1.pb2.Position:=0;
for i:=0 to 10000 do
begin
Form1.pb2.StepBy(1);
end;
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
m1: TMyThread1;
m2: TMyThread1;
begin
m1:=TMyThread1.Create(True);
m1.i_ca:=1;
m1.FreeOnTerminate := True;
m1.Resume();

m2:=TMyThread1.Create(True);
m2.FreeOnTerminate := True;
m2.i_ca:=2;
m2.Resume();
end;

想要实现的功能是点击按钮,两个主窗口的进度条同时跑,可我得到结果是一个一个依次运行的,为什么?
...全文
133 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ctjtn 2013-07-10
  • 打赏
  • 举报
回复
现在解决了,是自己对Synchronize没搞懂,谢谢各位了,结帖了。
ctjtn 2013-07-10
  • 打赏
  • 举报
回复
引用 3 楼 bbc9527 的回复:
代码不全,全部都发上来吧。
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, SPComm, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    pb1: TProgressBar;
    pb2: TProgressBar;
    procedure btn1Click(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
type
      TMyThread1 = class(TMyThread)
      protected
    procedure Execute;override;
       procedure SetPb;
       private
         i_ca:Integer;
     end;

procedure TMyThread1.Execute;
begin
    Synchronize(SetPb);
end;


procedure TForm1.btn1Click(Sender: TObject);
var
  m1:     TMyThread1;
    m2:      TMyThread1;
begin
 m1:=TMyThread1.Create(True);
 m1.i_ca:=1;
 m1.FreeOnTerminate := True;
 m1.Resume();

  m2:=TMyThread1.Create(True);
  m2.FreeOnTerminate := True;
  m2.i_ca:=2;
  m2.Resume();
end;

procedure TMyThread1.SetPb;
var
  i:Integer;
  i_cata:Integer;
begin
  i_cata:=i_ca;
  if i_cata=1 then
  begin
  Form1.pb1.Min:=0;
  Form1.pb1.Max:=10000;
  Form1.pb1.Position:=0;
  for i:=0 to 10000 do
  begin
    Form1.pb1.StepBy(1);
  end; 
  end else
  begin
     Form1.pb2.Min:=0;
     Form1.pb2.Max:=10000;
     Form1.pb2.Position:=0;
     for i:=0 to 10000 do
     begin
        Form1.pb2.StepBy(1);
     end;
  end;
end;
new_yang 2013-07-10
  • 打赏
  • 举报
回复
这个简单 我个人呢比较懒 给你贴个地址吧 人家大牛弄的 举一反三哦 http://www.cnblogs.com/del/archive/2009/02/11/1388700.html
bbc9527 2013-07-10
  • 打赏
  • 举报
回复
代码不全,全部都发上来吧。
ctjtn 2013-07-10
  • 打赏
  • 举报
回复
引用 1 楼 bbc9527 的回复:
代码只有线程1 procedure TMyThread1.Execute; begin Synchronize(SetPb); end; 这里用了同步,可能是这个原因
不懂,还有线程运行时,主窗口都被锁定了,我以前用C#不会这样啊,这是哪里的问题呢
bbc9527 2013-07-10
  • 打赏
  • 举报
回复
代码只有线程1 procedure TMyThread1.Execute; begin Synchronize(SetPb); end; 这里用了同步,可能是这个原因

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧