用一个线程去做一件事,和放心time事件里不断循环做有什么区别?如果不是在线程里使用sleep,那么在sleep的期间,主进程是不是全部停止呢?

解决方案 »

  1.   

    用一个线程去做一件事,和放心time事件里不断循环做有什么区别?
    -------
    用另一个线程去做一件事,本线程正在做的事不会被干扰;
    用timer去做一件事,timer也是在本线程做的事,所以会互相干扰。比如本线程要等timer里的事做完之后,才会再继续做事。如果不是在线程里使用sleep,那么在sleep的期间,主进程是不是全部停止呢? 
    --------
      

  2.   

    线程是另辟一进程,与主线程基本无关。而Timer还是在主线程中。它影响主线程的进度。
    sleep在本线程起作用(等待),那么不在线程中使用就是在主线程中使用sleep, 当然影响主线程了。
      

  3.   

    Timer的定时器事件依赖于Windows消息循环,事件代码的执行在主线程中,如果定时器事件中代码执行耗时过长,将会阻塞主线程。
    在主线程中使用sleep,将导致程序假死。
      

  4.   

    线程是另辟一进程,是不妥当。但为了表述,进程与主线程之间,就是一个另外分配CPU执行时间的机制而言。
      

  5.   

    现在很奇怪的是一段代码放在线程里执行,明显的会有延误的而如何把线程中的 主进程中执行就不会。代码:procedure TSaveDataThread.SelfExecute;
    var
      s:String;
      m,I:integer;
    begin
    procedure TSaveDataThread.SelfExecute;
    var
      s:String;
      m,I:integer;
    begin
    //  while AFree=1 do
      begin
        while  Bcommand do
        begin
          if ReadList.Count > 0 then     //在线程里执行,这里的count的值会越来越多,而放在进程,基本上是0
          begin
            s:=ReadList[0];
            if Length(s)>100 then
            begin
              for I := Low(FSaveDataByte) to  High(FSaveDataByte) do
                FSaveDataByte[i]:= 0;
              for i := 1 to Length(s) div 2 do
              begin
                m:=i*2-1;
                FSaveDataByte[i-1]:=StrToInt('$'+s[m]+s[m+1]);
              end;
      //        CnDebugger.LogMsg( s );
              Chan1ob.SaveVaTxt(8,FSaveDataByte);
              Chan2Ob.SaveVaTxt(90,FSaveDataByte);
            end;
            readlist.Delete(0);
          end;
          Sleep(1);
          Application.ProcessMessages;    end;
      end;
    end;
      

  6.   

    放了二个time事件,同时将time的enable=True,
    里面也都会同时执行,不会等待一个执行完再执行,这种不叫阻塞进程吧。那如何理解阻塞进程呢?就是进程本身要执行的内容变慢了?
      

  7.   

    怎么“同时”执行了?你在其中一个里面加上很耗时的代码试试,比如加个无限循环While True do;吧,你看会变成什么样
      

  8.   

    线程和进程不是一个概念。
    timer仍在主线程里。
    主线程里sleep会停止主线程。