我想在一个线程里实现监控的目的,比如监控一个listview里面每行内容(算是个队列吧),如果不为空则开启一个处理线程。
我原来是用timer实现的,可觉得当listview为空时很浪费资源。我觉得用线程实现更好些,可不会。希望那位大哥能给些帮助。

解决方案 »

  1.   

    不明白为什么你这样做,如果要做线程timer,我记得有第三方控件可以实现,AppControls Suite里有TacAccurateTimer。要监控其实不应该用定时器,如果有某个函数很久才返回,又无timeout之类的处理方法,那程序的稳定性就很危险了,特别是在和数据库有关的程序里,因为数据库的连接,读写都会有不可预见的隐藏问题。要自己写代码,可以参考以下这贴里我的回答,里头有在线程里处理消息的代码http://community.csdn.net/Expert/topic/3703/3703275.xml?temp=.9809229
      

  2.   

    监控一个listview里面每行内容,这还是要用到计时器的。
    你可以在计时器的事件里新建线程。
    在线程里写处理。
      

  3.   

    写一个函数如procedure forlistview;
    然后在线程的
    procedure Route1.Execute;
    begin
       while not Terminated do //这里可以保证不停循环监控类似timer功能
       begin
          forlistview;         // Synchronize(
       end;
    end;
      

  4.   

    while not Terminated do 有点启示了,再顶。消息队列是怎么回事?
      

  5.   

    ...Execute;
    Var
       startT:int64;//起始时间
       endT:int64;  //当前时间
       Freq:int64;  //
    begin
       QueryPerformanceCounter(startT);
       QueryPerformanceFrequency(Freq);
       while not Terminated do
       begin
          QueryPerformanceCounter(endT);
          if (endT-startT)/Freq>=1 then   //(endT-startT)/Freq得到的值的单位是Seconds
                                          //为防止因线程阻塞等问题引起超时
                                          //而不能预期重置记时器所以使用'>='
          begin
             //线程记时器代码
             //
             QueryPerformanceCounter(startT);//开始新一轮记时
          end;
          Sleep(10);                    //Sleep( milliseconds:Cardinal)的milliseconds最好大于0
       end;
    end;
      

  6.   

    另外线程记时器执行代码最好写成一个函数,然后在Execute用Synchronize调用。
      

  7.   

    2个线程
    做一监听标志 bTerminate
    在其中监听的线程的Excute事件
    while bTerminate do
      Synchronize(执行事件)
      

  8.   

    <<delphi 深度歷險>>中, 說得比較多, 可以參考, 或者到書店翻翻
      

  9.   

    如果我开了一个等待线程,怎么控制超时的时间?unsigned(僵哥) :也是用你说的那种方法实现吗?那是在循环看时间差的吧。能不能让程序在那里等待,直到超时触发超时退出?
      

  10.   

    我在Delphi6线程中:
    Application.CreateForm(TForm2, Form2);    
    Form2.ShowModal; 
    为什么编译时没错,运行老出错啊???