Ada*_*dam 0 delphi multithreading delphi-xe7
我的项目包含两个执行不同任务的过程,我执行一个计时器中的每个线程.
我的问题是,当我运行项目时,计时器启动.线程不能正常工作.
为什么?
而且,我可以在同一个项目中使用两个或更多线程吗?
注意:我真的想使用线程,我需要一个带线程的解决方案.
这是我没有线程的代码.
procedure TForm1.Timer1Timer(Sender: TObject);
var
i : integer;
begin
for i := 0 to 50 do
  begin
  Memo1.Lines.Add(IntToStr(i));
  sleep(500);
  end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
var
k : integer;
begin
for k := 0 to 50 do
  begin
  Memo2.Lines.Add(IntToStr(k));
  sleep(500);
  end;
end;
end.
Run Code Online (Sandbox Code Playgroud)
有线程:
type
TThread_Timer2 = class(TThread)
protected
  procedure Execute; override;
end;
type
TThread_Timer3 = class(TThread)
protected
  procedure Execute; override;
end;
procedure TThread_Timer2.Execute;
var
i : integer;
begin
for i := 0 to 50 do
  begin
  Memo1.Lines.Add(IntToStr(i));
  sleep(500);
  end;
end;
procedure TThread_Timer3.Execute;
var
k : integer;
begin
for k := 0 to 50 do
  begin
  Memo2.Lines.Add(IntToStr(k));
  sleep(500);
  end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
var
thd : TThread_Timer2;
begin
  thd := TThread_Timer2.Create(true);
  try
    thd.FreeOnTerminate := true;
    thd.Priority := tpHighest;
  finally
    thd.Resume;
  end;
end;
procedure TForm1.Timer3Timer(Sender: TObject);
var
trhd : TThread_Timer3;
begin
  trhd := TThread_Timer3.Create(true);
  try
    trhd.FreeOnTerminate := true;
    trhd.Priority := tpHighest;
  finally
    trhd.Resume;
  end;
end;
Run Code Online (Sandbox Code Playgroud)
    您可以根据需要使用尽可能多的线程.但是你必须遵守VCL的规则.具体而言,您只能从主线程访问VCL组件.您的代码违反了该规则.
每当您想从线程访问VCL组件时,请使用TThread.Synchronize或TThread.Queue方法在主线程上执行代码.
看看你的代码,如果你真的想在每次定时器触发时创建一个新线程,我会感到惊讶.这真的是你打算做的吗?并且try/finally在计时器程序中的使用充其量是可疑的.如果引发异常,你真的想要启动该线程.编译器应该告诉您该Resume方法已被弃用,您应该使用该方法Start.您是否启用了编译器提示和警告?您几乎肯定不希望修改线程优先级.如果使用不当,这可能会导致各种问题,就像这里的情况一样.
说完所有这些后,如果您愿意,可以使用计时器完美地编写代码并避免使用任何线程.您需要声明每次计时器过程触发时递增的几个计数器.例如:
type
  TForm1 = class(TForm)
  ....
  private
    FCounter1: Integer;
  .... 
  end;
Run Code Online (Sandbox Code Playgroud)
然后,当您想要开始计数时,初始化计数器并启动计时器:
 FCounter1 := 0;
 Timer1.Enabled := True;
Run Code Online (Sandbox Code Playgroud)
每当计时器触发你的增量计数器.当计数器达到上限值时停止计数器.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Memo1.Lines.Add(IntToStr(FCounter1));
  inc(FCounter1);
  if FCounter1 > 50 then
    Timer1.Enabled := False;
end;
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2591 次  |  
        
|   最近记录:  |