rt?

解决方案 »

  1.   

    不会的,我想你弄错了。
    建一个空的APPLICATION,只要一个FORM,编译产生EXE文件后,执行它,在W2000里面看到只有一个线程。
      

  2.   

    老兄,新建一个应该程序
    有没有看到任务栏的CAPTION和在桌面上的窗口的CAPTION不一样,
    其实它们是两个独立的窗体,各自有自己的消息循环,一个是PROJECT,一个是FORM
      

  3.   

    有些组件封装了线程,所以有时会看成是两个线程。有些窗体会独立于Application,看起来像两个Application(任务栏有两个),但其实是一个。一人进程有一个主线程,
    一个线程有一个消息队列,
    一个线程可以进行创建多个线程等等
      

  4.   

    确实有两个
    运行程序后
    View/Debug Windows/Threads
    第一个为主线程
    第二个不知道是何
      

  5.   

    而且第二个不是组件创建的
    F7键
    begin
      Application.Initialize;
      Application.CreateForm(TMainForm, MainForm);
      Application.Run;
    end.
    停在begin处
    这时候第二个线程就出来了
      

  6.   

    喂喂这样做是在IDE环境下调试运行啊!!! 怎么能说是默认两个线程呢?
      

  7.   

    halfdream:
      单独执行可执行文件
    我这是win2000 Server
    在任务管理器看到线程数2个
      

  8.   

    我用SPY++看了,我这里只有一个线程,有三个窗体:我把它列出来:进程 00000864 PROJECT1
       - 线程 00000AEC PROJECT1
        |_窗口 001A09E8~Project1TApplication
        |_窗口 00890964~Default IME~IME //注意,这个窗口是灰色的
        |_窗口 0097099C~Form1~FTorm1
    说明一个工程创建了多个窗口,而不是多个线程,楼主说有两个线程,有什么依据,贴出来大家共享一下。
      

  9.   

    新建一程序
    打开Thread窗口
    Thread Id             state
    Project1.exe
      $00000844           Runnable
      $00000818           Runnable
      

  10.   

    哦对了,我的是DELPH5+WIN2000 SERVER,DELPHI6我就不知道了
      

  11.   

    哦,我这是delphi6+win2000 server
      

  12.   

    D5 + sp2, D6 +sp2, D7都是一个线程OS: 2000server + sp2
      

  13.   

    我的系统WindowsXP English SP1+D7
    只有一个!!!/ by LY http://www.99898.com/www/lysoft
      

  14.   

    可是我的d6+win2000 pro就有阿!不过我怀疑application的窗口和mainform的窗口消息循环在两个线程中:unit Unit1;interfaceuses
      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.
      

  15.   

    但是我又作了一个测试:
    program Project1;uses
      sysutils;{$R *.res}begin
      sleep(10000);
    end.
    //////////////////////////竟然在任务管理器里面还是两个线程!难道真的是因为中文操作系统的输入法的缘故?
      

  16.   

    难道有专门感染delphi程序的病毒?
    怎么很多进程都是一个线程?
      

  17.   

    俺以为:
    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语句中。此为拙见,祈为见谅。
      

  18.   

    “就列出来了”->“就不列出来了”另,Delphi自称“VCL不是线程安全的”,俺以为与这里讨论的问题也有关系。
      

  19.   

    谢谢小可兄弟的解答,可是:
    “至于楼主举例在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,那么第一个问题又该怎样解释?
      

  20.   

    修正:
    俺前面的观点存在谬误,即“所有TForm对象实例的消息处理(就算是循环吧)都经过了Application消息处理”,经过本人全面跟踪测试,发现仅对异常是如此(即不论在哪个窗口中发生了异常,只要没有利用try...except进行妥善处理,那么就会导致应用程序终止),而对其他绝大部分Windows消息则不是。
    俺现在以为:
    对于Windows系统来说,Application与Form1是两个窗口,分别向它们发送的消息都是由操作系统的消息调度统一完成。因为它们在同一线程中(观察Thread ID证实如此),所以Windows为其创建一个公共的消息队列(消息队列与线程之间的一般关系)。
    至于Application有即时响应而Form1无即时响应,俺猜想应当与Windows消息调度的具体细节有关,目前在研究、关注和学习中...真没劲,俺明天(大年初五)就要开工了。
    祝愿大家发洋财!
      

  21.   

    任何没有响应的程序在 Windows 2000 下面,右键任务栏的按钮都会有 最小化 和 关闭 可以用,楼主可以试试。