由于以前一直从事ASP开发,没有接触过delphi,只是在以前用过vb几天。现在接到业务,客户要求做一个实时查询,也就是说从大约12万左右用户中查询数据。要求每次输入姓的时候就可以在一个listbox中列出这个姓的人员列表(比如最新增加的100个),比如查询一个“王二小”,我在输入“王”的时候显示最新增加的100个姓王的用户,输入“王二”的时候,显示前100两个字个叫“王二”的用户,由于数据大,查询一次要3秒左右,所以做成多线程查询,但是有个问题就是我只要快速输入信息,程序就会报错。查询资料说是上一个线程没有完成,相当于是两个线程同时对listbox写数据就会报错。但是我不知道怎么写这个判断上一个线程结束?
查询了好多资料,复制了别人说的一些代码,问题依旧,想上来问问大家有没有做个这个程序的,有的话提供点代码。
各位老大先谢了!

解决方案 »

  1.   


    var
      FAutoComplete: IAutoComplete2;
      FStrings: IUnknown;  // 把名字都读入FStrings  FAutoComplete  := CreateComObject(CLSID_AutoComplete) as IAutoComplete2;
      OleCheck(FAutoComplete.SetOptions(ACO_AUTOSUGGEST or ACO_UPDOWNKEYDROPSLIST));
      OleCheck(FAutoComplete.Init(QueryEdit.Handle, FStrings, nil, nil)); //QueryEdit  输入框
    不知你是不是要这样的? 
      

  2.   

    不是这个,意思差不多就是和输入法相似,也就是我在键入 “王”的时候,“王”开头的词都会显示出来,直接做也可以,但是程序会等待1-3秒,此时什么都做不了,所以做成多线程的,但是目前问题就是我只要只是输入“王”就没有问题,如果我快速的输入“王二”那就会报错,也就是线程1查询“王”开头的和线程2查询“王二”开头的同时对listbox写入数据操作,所以报错。怎么样避免上一个线程没有结束就不能新建下一个进程呢?搞了一个晚上也没有明白,呵呵!
      

  3.   

    弱弱的说句,你这个问题用多线程思路好像是错的,多线程不是做这个用的。
    如果有一万个人姓王,你的Listbox可够受的了.
    我感觉你应该做一个目录。
    你非要用多线程的话,可以用Thread.Synchronize 来调用写数据的方法,线程是不应该对VCL可视件直接操作的
      

  4.   

    对vcl可视控件,方法操作的时候要用线程同步Synchronize
    另楼主可以试试在循环里加入一句Application.ProcessMessages;
    这样也许可以满足你的要求
      

  5.   

    判断线程的状态是否为STILL_ACTIVE