线程A:
while(true)
{
MainUnit.addDemo(); {此函数在主程序中,实现的功能是根据条件增加一字符串
到一类型为TStringList的全局变量中}
}线程B:
while(true)
{
MainUnit.DelDemo(); {此函数在主程序中,实现的功能是根据条件删除类型为TStringList的全局变量的某数据}
}如何保护这个TStringList,也即使ADD的时候不能删除,Delete的时候不能ADD?
while(true)
{
MainUnit.addDemo(); {此函数在主程序中,实现的功能是根据条件增加一字符串
到一类型为TStringList的全局变量中}
}线程B:
while(true)
{
MainUnit.DelDemo(); {此函数在主程序中,实现的功能是根据条件删除类型为TStringList的全局变量的某数据}
}如何保护这个TStringList,也即使ADD的时候不能删除,Delete的时候不能ADD?
...
InitializeCriticalSection(cs);
...
EnterCriticalSection(cs);//进入临界区
-语句
LeaveCriticalSection(cs);//临界区结束
...
DeleteCriticalSection(cs);
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;
呵呵
另外firstshine(原曦)的方法虽然规范,但无法避免同时操作TStringList。
好像 itlcx(飛龍) 的方法能解决这个问题
无论是否使用临界区,线程A 的addDemo()只能是线程A来执行,线程B 的delDemo()只能是线程A来执行.但是无论是否使用临界区,线程A 的ddDemo()和线程B 的delDemo()有可能同时执行,这样就无法保护了那个MainUnit里面的全局变量。
线程A:
while(true)
{
MainUnit.addDemo(); {此函数在主程序中,实现的功能是根据条件增加一字符串
到一类型为TStringList的全局变量中}
}线程B:
while(true)
{
MainUnit.DelDemo(); {此函数在主程序中,实现的功能是根据条件删除类型为TStringList的全局变量的某数据}
}
这应该是一个互持事件
线程A:
while(true) and (信号灯为开)
{
关掉信号灯
MainUnit.addDemo(); {此函数在主程序中,实现的功能是根据条件增加一字符串
到一类型为TStringList的全局变量中}
打开信号灯
}线程B:
while(true) and (信号灯为开)
{
关掉信号灯
MainUnit.DelDemo(); {此函数在主程序中,实现的功能是根据条件删除类型为TStringList的全局变量的某数据}
打开信号灯
}你把信号灯设置为一个变量就行了。
传说中的WaitForSingleObject()与这个信号灯有关系吗?
临界区能够保护其内的变量,当其他
对于线程A的execute在
EnterCriticalSection(cs);//进入临界区
LeaveCriticalSection(cs);//临界区结束
内执行线程b的代码也在临界保护区内执行即可。
Gool Luck!