我创建了一个 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) 请问你能帮帮我吗.我正在编写一个组件(类似于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) 我一直在试图设置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) 我正在检查如何以安全模式从线程写入备忘录。问题是,当使用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) 有时这个函数会锁定我的程序,它会冻结,直到我关闭它.这有什么不对?
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)