传动态改变的参数(环境变量)有几个方法,
1)你可以设置一个全局变量,然后ThreadFunc执行的时候就不停验测这个全局变量就行。
2)用sendthreadmessage这个API发个消息给thread,参数的指针就放在消息的参数里,然后在thread里用peekmessage把相应的消息取出来,再用得到的指针去访问相应的参数也行。
3)用内存映射文件实现。一般来说没这个必要。用API建立的thread执行完只会把ThreadFunc所占用的内存释放掉,但ThreadFunc里由代码所分配的内存不会自动释放。如果你是用delphi,应该用Delphi的TThread对象,没必要用API自己建立一个Thread。

解决方案 »

  1.   

    设FreeOnTerminate := true ;
    时,线程对象在结束时资源自动释放掉
      

  2.   

    to DepYuka() :procedure ThreadFunc1();
    begin
    var i:integer;
    begin
      for i:=1 to 10000 do
        Form1.lable1.Caption:=inttostr(i);
    end;
    procedure ThreadFunc2();
    var i:integer;
    begin
      for i:=1 to 10000 do
        Form1.lable2.Caption:=inttostr(i);
    end;procedure TFORM1.button1click(Sender:TObject)
    var Tid1,Tid2:DWORD;
    begin
      CreateThread(nil,0,@ThreadFunc1,nil,0,Tid1);
      CreateThread(nil,0,@threadFunc2,nil,0,Tid2);
    end;
    为什么到4000多的时候就会出现错误呀?是不是因为DELPHI的VCL不支持多线程呀?
      

  3.   

    当线程用到vcl时
    要使用同步技术
      

  4.   

    你只是想实现这么简单的效果,就不要用API创建线程啦,VCL不支持多线程,所以当你在线程中悠改Form这一类由主线程维护(控制)的VCL对象的属性的时候,就会出现线程不同步的错误。如果你用的是TThread来制作你的程序。可以用TThread.Synchronize来实现和主线程的同步执行。劝你使用TThread。TThread几乎封装了所有和线程有关的API。使用起来方便,代码也简单明白得多。
      

  5.   

    procedure ThreadFunc1();
    var i:integer;
    begin
      for i:=1 to 10000 do
        Form1.label1.Caption:=inttostr(i);
    end;procedure ThreadFunc2();
    var i:integer;
    begin
      for i:=1 to 10000 do
        Form1.label2.Caption:=inttostr(i);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Tid1,Tid2:DWORD;
    begin
      CreateThread(nil,0,@ThreadFunc1,nil,0,Tid1);
      CreateThread(nil,0,@threadFunc2,nil,0,Tid2);
    end;我试了,没问题啊
      

  6.   

    TO pathe(睡斛):
    是不是就是DELPHI的VCL控件的原因呀?但是我是访问不同的控件呀,可不可以讲清楚一点呀?
    TO DepYuka() :
    我只是试验一下WIN API函数而已,并不是不愿用DELPHI自已的东西