线程中使用了xml就不能正确显示结果,求解(100分)

R

radarhp

Unregistered / Unconfirmed
GUEST, unregistred user!
我的想法是启动10个线程,每个线程负责一些ID的操作
比方
第一个线程负责1 2 3 4 5 ... 10, 101 102 103 104 105.. 110 , 201....210, 301...310 ....
第二个负责11 12 13 14 15....20, 111 112 113 114 115...120 , 211....220...........
第三个负责21 22 23 24 25....30, 121 122 123 124 125...130 , 221....230...........
.......
[red]现在的问题是listbox中不能正确显示所有经过处理的值,也就是说不能列出1....2000里面所有的整数值 [/red]
因为处理过程中使用了xml,自己注释了它就能正确列出所有的值,不注释就始终显示大多数的(不完整)
[red]所以请教大家,线程中该如何使用XML[/red]
代码:
type
  TMyThread = class(TThread)
  private
    { Private declarations }
    FStartID,FEndID,FTargeID: Integer;
             
    FStringList:TStrings;
                          
    procedure NewUpdateUI;
    procedure UpdateUI;
                      
    procedure work;
                           
  protected
    procedure Execute;
override;
  public
    constructor  Create(CreateSuspended: Boolean);
    destructor   Destroy;
override;
    property StartID:Integer read FStartID write FStartID;
    ........

//更新UI界面
procedure TMyThread.UpdateUI;
begin
  Form2.ListBox1.Items.AddStrings(FStringList);
end;

procedure TMyThread.work;
var
  i,j,k: integer;
  ID: Integer;
  XMLDoc: IXMLDocument;
  XMLNode: IXMLNode;
begin
  i := FStartID;
  j := 0;
  k := 0;
  try
    XMLDoc := NewXMLDocument(WideString('1.0'));
     //注释了它和下面一行就每次成功显示所有的ID到LISTBOX
    XMLDoc.Encoding := 'GBK';
                        
  except
    FSList.Add('id ' + IntToStr(FStartID) + ' 创建XML失败' );
    Synchronize(NewUpdateUI);
  end;

  While i < 2000do
  begin

    FStringList.Add( inttostr(i) + ' id = ' + IntToStr(ID) + ' processing...读取计数j=' + inttostr(j) + ' 写入计数k=' + inttostr(k) );
    Inc(j);
                
    if j < 10 then
      inc(i)                
    else
      begin
        j := 0;
            
        k := 0;
            
        i := i + 90;
      
      end;

    Sleep(10);
  end;

  log.Free;
  FreeAndNil(XMLDoc);
end;

procedure TMyThread.Execute;
begin
  { Place thread code here }
  FreeOnTerminate:=True;
  OnTerminate := Form2.ThreadsDone;
  Coinitialize(nil);
  Try 
    work;
  finally 
    CoUninitialize 
  end;

  //最后更新界面,在listbox里面列表经过计算的值
  Synchronize(UpdateUI);
end;




  //FORM中创建线程代码
  Thread0 := TMyThread.Create(True);
  Thread0.StartID := 1;
  Thread1 := TMyThread.Create(True);
  Thread1.StartID := 11;
  ......
  Thread9 := TMyThread.Create(True);
  Thread9.StartID := 91;

  Thread0.Resume;
  Thread1.Resume;
  .....
  Thread9.Resume;//启动10个线程
 
X

xyzbox

Unregistered / Unconfirmed
GUEST, unregistred user!
如果你是从硬盘上读取的,由于你的硬盘的读写速度没有CPU的快,导致在你读写硬盘的这段时间里,线程早已运行到另外的代码处了,导致读写数据有遗漏。建议统一使用内存读写
 
R

radarhp

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢回复,不过XMLDOC我真的只是定义了下而已……我只所以有这个代码,是因为我打算处理一个webservice的返回数据,鉴于速度的需要,采用了多线程
就算处理到了xml部分代码,那也是纯内存处理的,不会保存到硬盘上再来读取的
不过很感谢你,谢谢
 
A

apiao

Unregistered / Unconfirmed
GUEST, unregistred user!
很可能是你的xml部分不支持多线程,虽然在线程中调用,但是还是工作在同一个线程中
 
R

radarhp

Unregistered / Unconfirmed
GUEST, unregistred user!
汗,不会是我的xml不支持多线程吧?xml是用调用的msxml,在处理webservice的问题上,大多数服务返回的数据都是xml的……大家都是单线程在调用?
期待高手解答……
 
R

radarhp

Unregistered / Unconfirmed
GUEST, unregistred user!
汗,自己发现问题了,搞定……不过楼上的说法都不太正确,感谢你们的参与,谢谢
 

Similar threads

顶部