线程A:
while(true)
{
MainUnit.addDemo(); {此函数在主程序中,实现的功能是根据条件增加一字符串
到一类型为TStringList的全局变量中}
}线程B:
while(true)
{
MainUnit.DelDemo(); {此函数在主程序中,实现的功能是根据条件删除类型为TStringList的全局变量的某数据}
}如何保护这个TStringList,也即使ADD的时候不能删除,Delete的时候不能ADD?

解决方案 »

  1.   

    对strintList的操作语句设为临界区。var cs:TRTLCriticalSection;
    ...
    InitializeCriticalSection(cs);
    ...
    EnterCriticalSection(cs);//进入临界区
    -语句
    LeaveCriticalSection(cs);//临界区结束
    ...
    DeleteCriticalSection(cs);
      

  2.   

    线程A:
    TA.Execute;
    begin
      while(true) do
        Synchronize(AddToList)
    end;
    TA.AddToList
    begin
      MainUnit.addDemo();
    end;线程B:
    TB.Execute;
    begin
      while(true) do
        Synchronize(DeleteFromList)
    end;
    TB.DeleteFromList
    begin
      MainUnit.DelDemo(); 
    end;
      

  3.   

    谢谢firstshine(原曦)提醒,用Synchronize比较规范。
      

  4.   

    其实用API的才标准的
    呵呵
      

  5.   

    To ly_liuyang(Liu Yang) ,能否简单介绍一下?
    另外firstshine(原曦)的方法虽然规范,但无法避免同时操作TStringList。
    好像 itlcx(飛龍) 的方法能解决这个问题
      

  6.   

    itlcx(飛龍)的方法好像有问题。临界区是一段代码,一次只允许一个线程执行这段代码。
    无论是否使用临界区,线程A 的addDemo()只能是线程A来执行,线程B 的delDemo()只能是线程A来执行.但是无论是否使用临界区,线程A 的ddDemo()和线程B 的delDemo()有可能同时执行,这样就无法保护了那个MainUnit里面的全局变量。
    线程A:
    while(true)
    {
    MainUnit.addDemo(); {此函数在主程序中,实现的功能是根据条件增加一字符串
    到一类型为TStringList的全局变量中}
    }线程B:
    while(true)
    {
    MainUnit.DelDemo(); {此函数在主程序中,实现的功能是根据条件删除类型为TStringList的全局变量的某数据}
    }
      

  7.   

    这个情况要设置信息量的。
    这应该是一个互持事件
    线程A:
    while(true) and (信号灯为开)
    {
    关掉信号灯
    MainUnit.addDemo(); {此函数在主程序中,实现的功能是根据条件增加一字符串
    到一类型为TStringList的全局变量中}
    打开信号灯
    }线程B:
    while(true) and (信号灯为开)
    {
    关掉信号灯
    MainUnit.DelDemo(); {此函数在主程序中,实现的功能是根据条件删除类型为TStringList的全局变量的某数据}
    打开信号灯
    }你把信号灯设置为一个变量就行了。
      

  8.   

    请问信号灯是什么?有大侠简单介绍一下吗?
    传说中的WaitForSingleObject()与这个信号灯有关系吗?
      

  9.   

    itlcx(飛龍)正确
    临界区能够保护其内的变量,当其他
    对于线程A的execute在
    EnterCriticalSection(cs);//进入临界区

    LeaveCriticalSection(cs);//临界区结束
    内执行线程b的代码也在临界保护区内执行即可。
    Gool Luck!
      

  10.   

    To  fansnaf(投币一元),itlcx(飛龍)的方法无法解决这个问题,必须使用信号灯。