解决方案 »

  1.   

    是的,你理解是对的,你发的代码就是线程安全的。
    VCL线程同步是因为线程B手太长,用了线程A的里的对象。你贴的例子里只是传递一个int而已,所以没有线程安全问题。
      

  2.   

    VCL同步的通常叫法主线程同步
    线程安全,通常的概念是指对某一数据(对象、指针、某数据类型)进行读写保护,以保护各线程的读写的正确性。主线程同步作用:
      在访问VCL组件,如UI之类(窗体,界面相关的感知组件)及上述所说的某一数据。
      在进行该类Read/Write访问时,不会与主线程相关冲突,引起主线程界面假死、卡死。
      所以,一般进行UI同步时,一般作法是:post/send message 
      如:
      Post/SendMessage(ParentHandle, WM_XXX, X, Y);
      然后由有窗体的类中进行处理WM_XXX的消息
      注意点:
      Post注意返回值,是否post成功
      Send注意超时,也就是说在窗体消息处理尽可能高效这是次线程(工作线程)==>主线程
    反过来的同步操作是:主线程通知次线程的同步
    一般作法:
    1:PostThreadMessage(ThreadId, WM_XXX, X, Y)
         工作线程创建线程消息队列,不停的取消息,具体使用可查看: GetMessage, PeekMessage函数,或点进Application.Run看看它里面的函数看看。
    2:其它信号量,如Event, Semaphore
         Event/Semaphore + WaitFor函数
        while not terminated do
    [
          if WaitFor(event, timeout) = signal then
          [  do my code ];
    ]
    3:队列轮询
         写个队列吧,不停的检索队列是否有数据,这机制类似消息队列
        while not terminated do
    [
          if pop(queue, entry) then
          [  
             do my code with entry 
          ] 
          else
             sleep(x);      
    ]
    4:标志位触发
         不停的检查标志位。好像废话多了。
    多线程是个蛋疼的活计,原因就在于同步,特别你需要N线程竞争一个锁之后,要用好不容易,努力吧。
      
      

  3.   


    两个线程虽没有共享对象, 但却用了ShowMessage, 这个是要主线程同步的.
      

  4.   


    两个线程虽没有共享对象, 但却用了ShowMessage, 这个是要主线程同步的.我只想说,你贴的代码没有体现线程同步的问题。 showmessage是在主线程中运行的。打印线程ID看看就知道了。
      

  5.   

    PostMessage是不用等消息返回的,子线程发完这个消息就做其他事情去了
    SendMessage要等消息返回子线程才能去做其他的事研究一下用synchrsize同步的方法吧,不同步出了问题不好调,浪费时间
      

  6.   


    两个线程虽没有共享对象, 但却用了ShowMessage, 这个是要主线程同步的.我只想说,你贴的代码没有体现线程同步的问题。 showmessage是在主线程中运行的。打印线程ID看看就知道了。
    比较一下下面2种写法:
    写法1:
    ------------------------------------------------------------------------
    主线程:
    TMainThread.CMXXX(var Message: TMessage);message XXX;
    begin
      showmessage(IntToStr(Message.LParam));
    end;子线程:
    procedure TSubThread.Execute;
    begin
      PostMessage(FMainThread.handle, XXX, 0, 123);
    end;
    ------------------------------------------------------------------------写法2:
    ---------------------------------------------------------------------
    主线程:
    TMainThread.XXX(param: integer);
    begin
      showmessage(IntToStr(Param));
    end;子线程:
    procedure TSubThread.Execute;
    begin
      FMainThread.XXX(123);
    end;
      

  7.   

    vcl控件是不能在线程中存取的,只能在主线程中执行,这是底线原则!所以,你所谓的同步问题,是多余的。你只能在线程代码中,通过Synchronize过程,让你的代码在主线程上下文中访问vcl。