rt?
解决方案 »
- ServerSocket和ClientSocket简单的问题
- ADO访问数据库
- Installshield打包问题(在线等待急忙啊)
- Intraweb6.0.19了出来了,改进较6.0.15很多,有没有CRACK好的?原CRACK可用吗?
- delphi里有类似vb中doevents功能的函数吗?
- 如何编写网页浏览器
- 由于客户的报表经常变,所以想自己设计报表,不知怎样去实现?
- 请问RegisterServiceProcess在哪个dll里面?
- 函数小问题
- 文本文件 I/O
- 再次请教各位了,在delphi中如何生成可执行文件(送100分)!!!!!!!!!
- 在DEPHI里,怎样取下拉框选择的值?高分赠送
建一个空的APPLICATION,只要一个FORM,编译产生EXE文件后,执行它,在W2000里面看到只有一个线程。
有没有看到任务栏的CAPTION和在桌面上的窗口的CAPTION不一样,
其实它们是两个独立的窗体,各自有自己的消息循环,一个是PROJECT,一个是FORM
一个线程有一个消息队列,
一个线程可以进行创建多个线程等等
运行程序后
View/Debug Windows/Threads
第一个为主线程
第二个不知道是何
F7键
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
停在begin处
这时候第二个线程就出来了
单独执行可执行文件
我这是win2000 Server
在任务管理器看到线程数2个
- 线程 00000AEC PROJECT1
|_窗口 001A09E8~Project1TApplication
|_窗口 00890964~Default IME~IME //注意,这个窗口是灰色的
|_窗口 0097099C~Form1~FTorm1
说明一个工程创建了多个窗口,而不是多个线程,楼主说有两个线程,有什么依据,贴出来大家共享一下。
打开Thread窗口
Thread Id state
Project1.exe
$00000844 Runnable
$00000818 Runnable
只有一个!!!/ by LY http://www.99898.com/www/lysoft
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
sleep(10000);///////执行这个的时候,form1不会有反映,但是在任务栏上的代表application的东西能够点出右键并且能够接受最小化和关闭操作。显然是两个线程啊!!!!
end;end.
program Project1;uses
sysutils;{$R *.res}begin
sleep(10000);
end.
//////////////////////////竟然在任务管理器里面还是两个线程!难道真的是因为中文操作系统的输入法的缘故?
怎么很多进程都是一个线程?
1、除非特别处理,否则缺省情况下Delphi编译得到的应用程序只有一个进程和一个线程(因为它们的Process ID相同,它们的Thread ID相同);
2、只有一个Form并作为主窗口的工程,运行后有三个窗口:
xxxxxxxx "Project1" TApplication
xxxxxxxx "Form1" TForm
xxxxxxxx "Default IME" IME
它们的宿主关系(与创建和销毁有关)和父子关系(与显示有关)就列出来了,因为想都想得出来。以上资料是运行最简应用程序后通过Spy++观察得到。至于消息处理,都是由Application处理,通过消息调度等手段分发到各窗口。这一点可以观察Application.ProcessMessage的源代码得到。窗口的Caption不一样,只能说明是不同的窗口,不能与进程、线程没有因果关系。而且“各自有各自的消息循环”,严格来说是不准确的,因为所有TForm对象实例的消息处理(就算是循环吧)都经过了Application消息处理(观察Application.Run的源代码可以得到这一结论)。至于楼主举例在Form中Sleep(xxxxxx)的例子,只能说明Project1窗口有响应而Form1窗口太忙因此无响应,事实上它们都在同一消息循环中,即Application.Run中的repeat until语句中。此为拙见,祈为见谅。
“至于楼主举例在Form中Sleep(xxxxxx)的例子,只能说明Project1窗口有响应而Form1窗口太忙因此无响应,事实上它们都在同一消息循环中”
我不能理解。 你的意思到底是不是application和form1各自的消息循环在不同的线程中?即便form1的消息循环其实就是调用application.processmessages那么也不能证明在一个线程中,因为其实函数也相当于资源,类似全局变量,哪个线程调用了她,它就在哪个线程中执行,我怀疑application和form1在两个线程中调用了application.processmessages,这个没什么矛盾。否则怎么application的窗口有反映,而form1没有?sleep(10000)就是在form1的执行线程中调用的,那就是让form1的消息循环线程停滞10秒,而不是让application的执行线程停滞,否则右建任务兰菜单哪里来?至于说IME的问题,有没有form1(请看我贴的第二个例子),都是两个线程,而前面的迹象表明IME不在单独的线程中,(application能接受消息,而form1不能)。
可是没有任何窗口的进程照样是两个线程,这谁能解释?如果是IME,那么第一个问题又该怎样解释?
俺前面的观点存在谬误,即“所有TForm对象实例的消息处理(就算是循环吧)都经过了Application消息处理”,经过本人全面跟踪测试,发现仅对异常是如此(即不论在哪个窗口中发生了异常,只要没有利用try...except进行妥善处理,那么就会导致应用程序终止),而对其他绝大部分Windows消息则不是。
俺现在以为:
对于Windows系统来说,Application与Form1是两个窗口,分别向它们发送的消息都是由操作系统的消息调度统一完成。因为它们在同一线程中(观察Thread ID证实如此),所以Windows为其创建一个公共的消息队列(消息队列与线程之间的一般关系)。
至于Application有即时响应而Form1无即时响应,俺猜想应当与Windows消息调度的具体细节有关,目前在研究、关注和学习中...真没劲,俺明天(大年初五)就要开工了。
祝愿大家发洋财!