因为大部分VCL都不是线程安全的,不支持多线程,所以当你使用了TThread对象的时候,最好把界面更新的部分放到一个方法中,然后在线程的Execute方法中调用Synchronize(Your GUI Method);这样才能做到VCL同步

解决方案 »

  1.   

    用Event
      CreateEvent, ResetEvent, SetEvent
    通过WaitFor函数来等待这个Event触发,一个线程CreateEvent,有数据后SetEvent, 
    另一个线程WaitFor这个Event,当SetEvent后,取得这个线程的数据,然后ResetEvent
    或用PostThreadMessage,然后在另个线程中建立一个消息队列,PeekMessage/GetMessage
    数据可以通过Thread里面的域的数据,也可以通过PostThreadMessage将数据的指针传给另一个线程
      

  2.   

    请教:若用TEvent,每当有数据后,SetEvent,若不断的产生数据,就不断的SetEvet,可以吗?我不太清楚,请指点?
      

  3.   

    在写入时,触发事件
    而在线程中,用WaitForSingleObject
      

  4.   

    我在程序中试用了TEvent,确实能提高CPU的利用率。但我还有如下的问题:我的系统中有四路数据输入,我做了一个线程来对获取的四路数据进行处理,当某一路有数据来时,就SetEvent,我要用四个Event呢,还是一个,如何处理这个问题?谢谢!
      

  5.   

    看来你只需要四个线程通知一个线程,用一个Event就行了。
    如果虽然是一个处理线程,不同的数据来源处理不同,那还是用四个Event更清晰简便一些。
      

  6.   

    有四个数据来源,用一个线程处理,每当有数据来是就SetEvent;我用了一个Event,但处理四路时总是出错,而处理一路是又没问题。为什么?
      

  7.   

    四路数据存放到teslist时没采用同步会出错。
      

  8.   

    考虑了同步!问题出在利用一个Event来处理四路数据,每当一路有数据时就SetEvent一次。
      

  9.   

    用四个Event
    WaitFor不是有个WaitForMultpleObjects等待多个Handle,
                         //等待4个
    var
      Event: array [0..3] of THandle;Event[0] := CreateEvent(...);  //线路1
    ....case WaitForMultipleObjects(4, @Event[0], , False, INIFITINE, QS_ALLINPUT) of
      WAIT_OBJECT_0: ;//第一个线路的Event触发
      WAIT_OBJECT_0 + 1: ;//第二个线路的Event触发
      WAIT_OBJECT_0 + 2: ;//第三个线路的Event触发
      WAIT_OBJECT_0 + 3: ;//第四个线路的Event触发
    else
      ErrorProc;//  
    end;
    如果不想用Event,嫌它多的话,可以用:
    Semaphore
    CreateSemaphore, ReleaseSemaphore, 和WaitFor的组合
    它是像计数器一样,限定资源的数量,通过WaitFor, ReleaseSemaphore来得到和Release资源计数器
      

  10.   

    简单点的办法,在线程中适当加些Sleep()
      

  11.   

    你不是定时查询吗?
    在每次查询后sleep一下。也许就好了。
      

  12.   

    你不是定时查询吗?
    在每次查询后sleep一下。也许就好了。
      

  13.   

    我用了两组各四个TEvent,当有数据来时,对应通道获取数据后,TEvent。setevent,向数据处理线程发出处理信号,当数据处理线程处理数据后,获取有需要的信息,则又由相应的Event.setevent,控制线程获取信息后开始处理。在实际系统运行中,我发现实时性达不到要求。当数据处理线程产生需要的信息后,往往要几秒钟后控制线程才有响应。请教问题出在那里?如何改进?
      

  14.   

    在线程中加 Sleep(n); n 单位是毫秒,n > 0。你可以 Sleep(100), 0.1 秒的延迟应该可以接受。
      

  15.   

    试一下将线程的优先级稍高点试下。
    WaitFor在Windows我也总觉得有延迟。:(