标签: tthread

Delphi 中的线程化 Excel 文件处理

我创建了一个 TThread 来处理 Excel 文件中的一些关键问题,但是,我目前遇到了一些挑战,因为该线程似乎没有与我的应用程序并行工作。尽管我尽了最大努力来找出问题的根本原因,但到目前为止我还没有成功。为了解决这个问题,我尝试使用重写的 Execute 方法定义 TThread 类型,并尝试从 Synchronize 方法切换到 Queue 方法,但到目前为止,这两种方法都没有产生积极的结果。

procedure TForm2.Button1Click(Sender: TObject);
begin

 TThread.CreateAnonymousThread(proc).Start;

end;

procedure TForm2.Proc;
var
refSheet: Integer;
  RowCount,varGridRow:Integer;
  i, j,k: Integer;
  desc, refDesc, refRate: string;
  delta: Integer;
  OldValue:String;
  ws: Variant;
  ExcelApp: Variant;
begin
Tthread.Synchronize(nil,procedure ()begin
if OpenDialog1.Execute then
 begin
 ExcelApp := CreateOleObject('Excel.Application');
 ExcelApp.Workbooks.Open(OpenDialog1.FileName);
 end;
 end);

 Tthread.Synchronize(nil,procedure ()  begin
  refSheet :=StrToInt(InputBox('','','3'));
  if (refSheet <= 0) or (refSheet > ExcelApp.Worksheets.Count) then
  begin
    ShowMessage('Invalid sheet number');
    Exit;
  end;
 end);

 Tthread.Queue(nil,procedure ()var i,j,k:Integer; begin
 IssamProgressBar1.Max:= ExcelApp.Worksheets[refSheet].UsedRange.Rows.Count;
  RowCount:=1; …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading tthread

1
推荐指数
1
解决办法
214
查看次数

如何正确使用TThread

请问你能帮帮我吗.我正在编写一个组件(类似于TListView),在我的组件中,我逐个执行3个过程:

procedure findFiles(Path:String); // using FindFirst, FindNext
procedure ArrangeItems; // assigns Item Position
procedure SetIcons;    // Loads Images, resizes, adds to ImageList
Run Code Online (Sandbox Code Playgroud)

我无法理解如何使我的组件使用Threads来执行所有这些过程,至少是第一个(findFiles).我尝试了不同的方法但没有任何结果.

这是我所拥有的一切(只是一个基本的例子).

 type
  TSearchThread = class(TThread)
  private
    SIView: TSIView;
  protected
    procedure Execute; override;
    procedure DoSearch;
  public
    constructor Create(fSIView: TSIView);
  end;



 constructor TSearchThread.Create(fSIView: TSIView);
 begin
  SIView := fSIView;
  FreeOnTerminate := True;
  inherited Create(False);
  Priority := tpLower;
 end;

 procedure TSearchThread.Execute;
 begin
  inherited;
  Synchronize(DoSearch);
 end; 

 first I tried to perform 
   SIView.findFiles('C:\');
   ArrangeItems;
Run Code Online (Sandbox Code Playgroud)

然后才执行线程来设置适当的图标(SetIcons):

 procedure TSearchThread.DoSearch;
 begin
  SetIcons;
 end;
Run Code Online (Sandbox Code Playgroud)

它有效,但有错误:有时我的组件创建的图标不是所有项目,有时一些项目的图标完全填充黑色,有时我根本没有图标;

然后我决定在线程中执行所有3个程序:

 procedure …
Run Code Online (Sandbox Code Playgroud)

delphi tthread

0
推荐指数
2
解决办法
2374
查看次数

在TThread.OnTerminate上设置/更改TThread.FreeOnTerminate

我一直在试图设置FreeOnTerminate属性OnTerminate过程,但它似乎像它要么为时已晚来设置它,或者它完全无视write程序.

如何设置/更改FreeOnTerminate属性OnTerminate程序?那有什么变通方法吗?

一点点代码:

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    procedure OnTestThreadTerminate (Sender : TObject);
  public
    { Public declarations }
  end;

type
  TTestThread = class (TThread)
  public
    procedure Execute; override;
end;


var
  Form2: TForm2;
  GlobalThreadTest : TTestThread;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin …
Run Code Online (Sandbox Code Playgroud)

delphi tthread

0
推荐指数
1
解决办法
1613
查看次数

TThread.Synchronize 导致表单冻结

我正在检查如何以安全模式从线程写入备忘录。问题是,当使用TThread.Synchronize它时,表单会冻结,而没有它,表单就可以正常工作。

这是冻结的代码:

procedure TestThread;
var
  x : Integer;
begin
  for x := 0 to 2 do
  begin
    TThread.CreateAnonymousThread(
    procedure
    begin
      while True do
      begin
        TThread.Synchronize(TThread.CurrentThread, procedure
        begin
          //CritLock.Acquire;
          try
            Form1.Memo1.Lines.Add('Add to Memo ' + IntToStr(GetTickCount));
          finally
            //CritLock.Release;
          end;
        end);
      end;
    end).Start;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

这里是不冻结的代码:

procedure TestThread;
    var
      x : Integer;
    begin
      for x := 0 to 2 do
      begin
        TThread.CreateAnonymousThread(
        procedure
        begin
          while True do
          begin
            //CritLock.Acquire;
            try
              Form1.Memo1.Lines.Add('Add to Memo ' + IntToStr(GetTickCount));
            finally
              //CritLock.Release;
            end;
          end; …
Run Code Online (Sandbox Code Playgroud)

delphi tthread

0
推荐指数
1
解决办法
145
查看次数

Delphi:TThreadList有时会锁定程序

有时这个函数会锁定我的程序,它会冻结,直到我关闭它.这有什么不对?

function del_from_list(id:string):boolean;
var i : integer;
begin
  Result := True;
  try
    with global_list.LockList do
    begin
      for i:=0 to Count-1 do
      begin
        if Tthread_list(Items[i]).id = id then
        begin
          Delete(i);
          break;
        end;
      end;
    end;
  finally
    global_list.UnlockList;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

班级

  Tthread_list = class
  public
    id   : string;
    constructor Create(const id: string);
  end;
Run Code Online (Sandbox Code Playgroud)

我正在添加到列表中:

global_list.Add(Tthread_list.Create('xxx'));
Run Code Online (Sandbox Code Playgroud)

全局列表是一个全局变量

var global_list : TThreadList = nil;
Run Code Online (Sandbox Code Playgroud)

delphi multithreading tthread

-3
推荐指数
1
解决办法
3506
查看次数

标签 统计

delphi ×5

tthread ×5

multithreading ×2