比如我有三个过程,同时调用一个函数,这个函数在调用的时候,会在内存中同时拷贝三份,还是只有一份,这个函数里面的局部变量会不会互相干扰?还是虽然是同一个局部变量,但是调用的时候,存在三个变量副本?

解决方案 »

  1.   

    procedure TForm1.btn2Click(Sender: TObject);
    begin
      aa('btn2 : ');
    end;procedure TForm1.btn1Click(Sender: TObject);
    begin
      aa('btn1 : ');
    end;procedure TForm1.aa(a : string);
    var
      I : Integer;
    begin
      for I := 1 to 5000 do begin
        mmo1.Lines.Add(a + IntToStr(I));
        Application.ProcessMessages;
      end;btn1执行到一半,btn2插入,把btn2的先执行完了,然后把btn1的继续执行完,输出都是1--5000
      

  2.   


    为什么会把原来执行的过程给停止了,执行后进入,难道是真的是类似这种堆栈当btn2点击时,btn1执行到Application.ProcessMessages,此过程检索消息队列中的消息,刚好检索到btn2的点击消息,于是由ProcessMessages内部的DispatchMessage分派消息到窗口过程,最终调用btn2click,调用完之后,DispatchMessage和ProcessMessages相继返回,继续执行btn1click中的代码.
      

  3.   

    我认为这位仁兄说得太绝对。
    在程序中有时间控件的前提下,如果有以下方法,算不算主线程内的可重入函数呢?
    procedure TForm1.OnTimer()
    var
      xxx:xxx;
    begin
       ...
       ...
       Application.ProcessMessage();
    end;
      

  4.   

    代码在内存中只有一份。
    cpu从内存中加载代码执行,即使多线程也不用担心,因为代码区是静态只读的,大家都在读,不存在同步问题。
    局部变量在各自线程的栈中,不用担心线程同步问题。