线程的问题:
1、什么是多线程?
procedure Tfrmjianting.Button1Click(Sender: TObject);
begin
ClientHandleThread := TClientHandleThread.Create(True);
ClientHandleThread.Resume; //开始执行
end;
这样的话是不是每次点这个按钮,都会产生一个线程?那他们不都是叫一个名字了吗?多线程是不是必须我手动创建?比如:
ClientHandleThread1,ClientHandleThread2: TClientHandleThread;
2、线程同步:能把这个概念给我讲详细些吗?
AThread.Synchronize(AddLogEntry);
这样的意思是不是athread这个线程创建了一个子线程,来执行AddLogEntry这个过程?或者是
是不是为“AddLogEntry”这个过程加个锁似的?
AddLogEntry这个过程还是在AThread分配的内存里执行的 ?3、主线程、父线程、子线程,这些是怎么区分的?有什么标志吗?
1、什么是多线程?
procedure Tfrmjianting.Button1Click(Sender: TObject);
begin
ClientHandleThread := TClientHandleThread.Create(True);
ClientHandleThread.Resume; //开始执行
end;
这样的话是不是每次点这个按钮,都会产生一个线程?那他们不都是叫一个名字了吗?多线程是不是必须我手动创建?比如:
ClientHandleThread1,ClientHandleThread2: TClientHandleThread;
2、线程同步:能把这个概念给我讲详细些吗?
AThread.Synchronize(AddLogEntry);
这样的意思是不是athread这个线程创建了一个子线程,来执行AddLogEntry这个过程?或者是
是不是为“AddLogEntry”这个过程加个锁似的?
AddLogEntry这个过程还是在AThread分配的内存里执行的 ?3、主线程、父线程、子线程,这些是怎么区分的?有什么标志吗?
解决方案 »
- procedure RealizeLength
- Delphi7安装DevExpress组件的问题
- (兄弟们帮助我改一下这个线程) 当我发信息(执收send后)在线程中等待数据的到来,如果数据到了,退出线程,否则30秒后就算超时,也退
- 请问我在一个DX的程序上想显示自己的字,遇到了这样的问题
- TWebBrowser求助,怎么禁止浏览?
- 为什么在tChart动态添加 Series 后 不能 显示出来 ?????????????????????????? 急!!!!!!!!!
- 再一个关于StringGrid的问题!
- 笑话.........
- 选取combobox下拉列表中的值后,在combobox.text里只显示其部分内容该怎么做?
- 使用InputBox输入口令,要在输入框中显示全为"*",怎么办?
- 100分送上。我的机器中毒后,sql server 无法使用。再次安装的时候,出错了。
- [讨论]socket的三种构造方式的比较
----多线程同时执行,将会引起对共享资源的冲突。为避免冲突,就要用同步多线程对共享资源进行访问。WIN95提供了许多保持线程同步的方法,笔者采用创建事件对象来保持线程同步。通过CraeteEvent()创建事件对象,使用SetEvent()或PulseEvent()函数将事件对象设置成信号同步。在应用程序中,利用WaitSingleObject()函数等待同步的触发,等到指定的事件被其它线程设置为有信号时,才继续向下执行程序。
2.窗体主线程里走的。
是的,如果这个线程不结束的话,每按一次就会产生一个新的线程。
因为:首先,你这个线程Object没有释放,所以只要这个Object的线程还在执行(Execute没有返回),线程就会存在;其次,并不是都是一个名字,而是在你第二次按这个按钮时,前一个线程Object的引用就被丢失了,这样就无法显式释放这个线程Object,除非使用FreeOnTerminate让它在线程结束后自动释放,否则将出现MemLeak;最后,多线程不一定是手工创建,比如采用线程阻塞方式的网络控件(SERVER SIDE)在每个新的客户端连接时都会自动创建一个新的线程。2、线程同步:能把这个概念给我讲详细些吗?
关于Synchronize我的文章里已经说的很清楚了,自己去看看。3、主线程、父线程、子线程,这些是怎么区分的?有什么标志吗?
没什么标志,线程都是平等的,只是有时为了表达方便才加以区别。
对于单线程应用来说,每个进程就只有一个线程,这个线程就是主线程,其它的线程一般来说都是由这个主线程创建(远程线程除外),所以其它的线程都是它的子线程,而它是所有子线程的父线程,如果子线程再创建子线程,则创建者是被创建者的父线程,被创建者是创建者的子线程。
但要记住,父线程并不表示比子线程级别高(插一句,这里说的级别也不是指优先级),并没有更多的特权,线程在创建后都是平等的,父线程结束并销毁对子线程完全没有影响。
但主线程是个例外,因为它与进程是一一对应的,主线程的结束就标志着进程的结束,而进程结束时会销毁所有此进程中的线程,不论它是否结束。
创建新的进程(包括其他类的实例),最好不要直接在client new,使用工厂模式去创建它。
至于是否是多线程,看你的需要,如果你只想有一个实例,那么就使用单例模式,让它自己创建