解答: 好吧,这很简单(可能我犯了这个错误因为我需要更多的睡眠:)): 我创建了First Thread,它创建了Sub-Threads并自由编辑了它。所以有些子线程无法访问不存在的内存(在它们尝试之前 - 第一个线程已经没有在内存中),这很自然。
您好, 我正在尝试简单的应用程序。 我的需求是创建例如1-3个线程(我将它们称为First Threads),这将创建接下来的几个线程(我将其称为子线程)。
我知道该怎么做,这就是我所做的:
第一个线程定义:
type
TFirstThread = class(TThread)
//
strict private
fID:cardinal; //fID = position on watki array + 1
fDoneItems:cardinal;
fItems:TSomeRecordAr;
//(...)
procedure ParseItem(var item: TSomeRecord; itemID:cardinal);
private
public
published
function GetItem(itemindex:cardinal):TSomeRecord;
procedure SetItem(itemindex: cardinal; item: TSomeRecord);
//(...)
procedure Execute; override;
end;
TSomeRecord是:
TSomeRecord = record
str,str2:string;
lst:TStrings;
continue:boolean;
end;
子线程定义:
TSubThread = class(TThread)
public
fReady:boolean;
fID,fItemID:cardinal;
procedure Execute; override;
end;
还有First Threads数组:
watki:array of TFirstThread;
第一线程的主体:
{ TFirstThread }
//(...)
procedure TFirstThread.ParseItem(var item:TSomeRecord; itemID:cardinal);
begin
//(...)
with TSubThread.Create(False) do begin
fID:=Self.fID;
fItemID:=itemID;
fReady:=True;
end;
end;
procedure TFirstThread.Execute;
var
i:cardinal;
begin
FreeOnTerminate:=True;
while fReady=False do
Sleep(10);
//(...)
fDoneItems := 1;
for i := 0 to High(fItems) do begin
ParseItem(fItems[i], i);
end;
//
end;
function TFirstThread.GetItem(itemindex: cardinal): TSomeRecord;
begin
result:=fItems[itemindex];
end;
procedure TFirstThread.SetItem(itemindex: cardinal; item: TSomeRecord);
begin
fItems[itemindex]:=item;
end;
子线程主体:
procedure TSubThread.Execute;
var
ftd:string;
tries:cardinal;
fItem:TSomeRecord;
begin
FreeOnTerminate:=True;
while fReady=False do
Sleep(10);
try
//(...)
fItem := watki[fID-1].GetItem(fItemID); //HERE AV <<
fItem.continue:=True;
//(...)
finally
watki[fID-1].SetItem(fItemID, fItem);
//(...)
//Free;
end;
end;
这是它在实践中看起来的样子: 在我测试时,我只创建了1个First Thread并启动它。它有3个项目,因此它创建3个子线程。
当我在TFirstThread中创建断点时,我就能看到:
http://i.stack.imgur.com/EGaBO.jpg
一切都好, 但在那之后,当我在TSubThread中创建断点时,这就是我得到的:http://i.stack.imgur.com/gXhHW.jpg
所以,除了fItems之外,任何人都可以 - idk为什么,但我看不出它的内容。所以我得到了AV,我希望得到的coz项目不存在。
为什么会这样?任何解决方案?
提前致谢。
顺便说一句,我正在使用Delphi 2009
解答: 好吧,这很简单(可能我犯了这个错误因为我需要更多的睡眠:)): 我创建了First Thread,它创建了Sub-Threads并自由编辑了它。所以有些子线程无法访问不存在的内存(在它们尝试之前 - 第一个线程已经没有在内存中),这很自然。
答案 0 :(得分:1)
好吧,这很简单(可能我犯了这个错误因为我需要更多的睡眠:)):我创建了第一个线程,它创建了子线程并自由编辑了它。所以有些子线程无法访问现有内存(在他们尝试之前 - 第一个线程已经没有在内存中),这很自然。