X xjahello Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-05 #1 我要在子线程中修改一全局变量,且在主线程给它赋初值。我是用TCriticalSection锁定,怎老不成功 在主线程里好象不能锁,锁就提出空地址错误,我没用过这个,具体是怎么做的,望多指点一下。谢谢
T toplucky01 Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-05 #5 主线程赋初值,其他线程调用TCriticalSection进行读写,记得leave。用 mainunit; b : TCriticalSection; mythreadunit; b.enter; try MainUnit.xx:=yy; finally b.leave end;
主线程赋初值,其他线程调用TCriticalSection进行读写,记得leave。用 mainunit; b : TCriticalSection; mythreadunit; b.enter; try MainUnit.xx:=yy; finally b.leave end;
F firstrose Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-05 #6 记得先b:=TCriticalSection.Create; 最后free
T thx1180 Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-05 #7 临界区是一种最直接的线程同步方式。所谓临界区,就是一次只能由一个线程来执行的一段代码。可以在这样的代码中访问全局变量。 主线程只有一个,定义一段一次只能由一个主线程来执行的代码没有任何意义。
G gztomash Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-06 #8 子线程关于该变量的都通过Synchronize调用执行就行了。 TMyThread = class(TThread) private FBackupValue: Integer; // 因为Synchronize没参数,只好自己来! procedure SetValue; // 赋值给全局变量 ... end; procedure TMyThread.SetValue; begin TheVariant := FBackupValue; // 赋值给全局变量 end; // 调用举例 FBackupValue := NewValue; Synchronize(SetValue);
子线程关于该变量的都通过Synchronize调用执行就行了。 TMyThread = class(TThread) private FBackupValue: Integer; // 因为Synchronize没参数,只好自己来! procedure SetValue; // 赋值给全局变量 ... end; procedure TMyThread.SetValue; begin TheVariant := FBackupValue; // 赋值给全局变量 end; // 调用举例 FBackupValue := NewValue; Synchronize(SetValue);
B barton Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-06 #9 楼主把问题丢下来然后自己不来了。 Synchronize不如CriticalSection。为什么?因为Synchronize会将更新变量的操作变成 一个通知消息,一直要等到消息循环到这里才处理,等于还是在主线程中更新变量。这还 用多线程干嘛?按楼主说的逻辑,CriticalSection应该能够解决的。
楼主把问题丢下来然后自己不来了。 Synchronize不如CriticalSection。为什么?因为Synchronize会将更新变量的操作变成 一个通知消息,一直要等到消息循环到这里才处理,等于还是在主线程中更新变量。这还 用多线程干嘛?按楼主说的逻辑,CriticalSection应该能够解决的。
G gztomash Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-06 #10 CriticalSection的高效是有代价的,那就是不能在加锁主线程(进程), 只能在各个子线程之间使用!楼主的命题好像已经很清楚的写明了跟主线程 有关嘛!
B barton Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-06 #11 逻辑上主线程赋初值的时候线程应该还没有运行甚至还没有创建。如果能够保证主线程不 对变量作写操作主线程是不需要锁的,何况主线程从来就不应该锁。
G gztomash Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-06 #12 当然,Barton的逻辑是对的,只是表述上有些可以改善的地方,另外,未免有些教条主义…… 我是非常不欣赏教条的。 1、先初始化再使用!这样表述也许更直接清楚些。 2、严格上说,其实只有可能造成冲突的线程之间才需要锁定的,CriticalSection其实 仍然有滥杀无辜的嫌疑,只是,除非有特定的需求,否则已经可以将就着用了。 3、对于对进程或者线程的锁定问题,其实没有什么应该不应该的,有需要就应该,不需要 就不应该,在某些特定应用下,挂起某些进程的做法也不是没有。再说,锁定线程 等待另一个线程执行完毕,在DBMS应用中比比皆是,在这里,根本就不区分主次。
当然,Barton的逻辑是对的,只是表述上有些可以改善的地方,另外,未免有些教条主义…… 我是非常不欣赏教条的。 1、先初始化再使用!这样表述也许更直接清楚些。 2、严格上说,其实只有可能造成冲突的线程之间才需要锁定的,CriticalSection其实 仍然有滥杀无辜的嫌疑,只是,除非有特定的需求,否则已经可以将就着用了。 3、对于对进程或者线程的锁定问题,其实没有什么应该不应该的,有需要就应该,不需要 就不应该,在某些特定应用下,挂起某些进程的做法也不是没有。再说,锁定线程 等待另一个线程执行完毕,在DBMS应用中比比皆是,在这里,根本就不区分主次。
T thx1180 Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-06 #13 建议看看《Delphi 5开发人员指南》第十一章,11.3.2 线程同步,讲的很清楚了,它给出的示例程序和楼主的几乎一样。 下载:http://fdelphi.myrice.com/delphidoc.html
建议看看《Delphi 5开发人员指南》第十一章,11.3.2 线程同步,讲的很清楚了,它给出的示例程序和楼主的几乎一样。 下载:http://fdelphi.myrice.com/delphidoc.html