<>最近在写一个程序用到了多线程,所以对CB下的多线程有一定的学习。 * r2 v' x3 I0 i; ?8 |. B现在把自己的一些心得讲一下。水平有限,写的很粗略,请大家见谅。</P> 4 L* v0 f+ \2 R2 `0 x<>CB相对于VC来说,在CB下写多线程程序是很简单的。不仅是VCL中有TThread这个类。封装了那些关于多线程的WINDOW API。我觉得更方便的是他提供了 + b. w3 u4 D- ^+ X直接访问主VCL线程中对象的能力。可以很容易的和主线程中的窗体,控件 ; B# t w5 c* E( m8 u" p# C打交道。和单线程的方式没有太多区别。只是在有多个线程都要访问主线程& l. {* ^; p5 j! O, _, D
中的对象(比如访问同一个窗体上的StringGrid).只要用Thread的Synchronize方法来调用那段访问主VCL线程的代码(具体请看帮助),我们就不用担心访问冲突的问题了。而且对于多线程的同步和互斥,CB也对WINDOW 编程中那些机制进行了封装。比如对临界区CriticalSection封装为TCriticalSection.事件Event封装为TEvent.这些类相当简单好用。 ! G5 Y9 D' d( ^6 M7 o4 F下面就是我觉得比较重要的几点,供大家参考.</P>; l3 d* h* z( [0 J" y# V* c6 W
<> 5 |1 Q6 y( c8 _3 E1。TThread的WaitFor方法。是等待一个线程返回。其返回值在这个线程里可以任意设定。以便在该线程返回的时候让调用他的线程知道他的运行情况。 1 h( h4 V F+ C+ s+ l
1 T4 @+ Z. F2 A2 w/ j( C$ K在TThread的 OnTerminate事件中做线程的清除工作。他不是线程运行的一部分。 ; s( ]. x, U3 \' u, c/ N, {
而是主VCL线程的一部分。所以在其中不能访问Thread的局部变量(如 int __thread i) " {. e ]7 R2 Q s4 Q) H
你可以把清楚代码写在这里,不用管现在在EXCUTE()方法执行到了哪个地方。 + [: g I8 P, Q7 C; G; D' R w
这么看起来有点类似于C++里的 finally 块的作用。 ! f1 H% ]" u; s& }
( c; H. P. l6 P7 w& B0 v
2。TEvent很重要。实现线程的同步。WaitFor(int Timeout)功能类似于 , E$ K) G0 g4 s' }. f( J! D
WINDOW API WaitforSingleObject().返回值包括: / p g) u6 N$ r/ e, z
其中参数Timeout可以设为INFINITE表示永久等待,但这样,程序很容易死在这里。 % _- ]; W6 R$ h- w, v; D S