Delphi:一个线程无法看到其他线程的数组

时间:2011-04-21 11:16:56

标签: multithreading arrays delphi access-violation

解答: 好吧,这很简单(可能我犯了这个错误因为我需要更多的睡眠:)): 我创建了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并自由编辑了它。所以有些子线程无法访问不存在的内存(在它们尝试之前 - 第一个线程已经没有在内存中),这很自然。

1 个答案:

答案 0 :(得分:1)

好吧,这很简单(可能我犯了这个错误因为我需要更多的睡眠:)):我创建了第一个线程,它创建了子线程并自由编辑了它。所以有些子线程无法访问现有内存(在他们尝试之前 - 第一个线程已经没有在内存中),这很自然。