我的程序建立一个线程可是一调用就出错,各位给点灵感,delphi_han(小强),你有例子么,参考参考!!!

解决方案 »

  1.   

    你的显示部分是否单独放在一个过程中,并由sychronize()调用?
      

  2.   

    我刚刚学delphi,我以前用过c++ builder,对线程比较了解,可是这两种语言看起来很像,不过用起来差的很多啊!我现在主要是不能调用execute 里的程序,按说应该是最简单的一步啊,怎么会这样呢!
      

  3.   

    to :DelphiStudy(AgainstWar)
    姓韩
      

  4.   

    先给你找一个DELPHI的的例子( 一) 当 使 用 线 程 时, 我 们 主 要 有 两 个 任 务: 
    ---- (1) 创 建 一 个 线 程。 
    ---- (2) 创 建 一 个 能 作 为 线 程 入 口 的 函 数。 
    ---- Windows API 调 用CreateThread 函 数 来 创 建 一 个 线 程。 函 数 如 下: 
    HANDLE CreateThread(LPSECURITY_
    ATTRIBUTES lpThreadAttributes,
    //线程安全属性地址
    DWORD dwStackSize,
    //初始化线程堆栈尺寸
    LPTHREAD_START_ROUTINE lpStartAddress,
    //线程函数所指向的地址
    LPVOID lpParameter,
    //给线程函数传递的参数
    DWORD dwCreationFlags,
    //有关线程的标志
    LPDWORD lpThreadId
    //系统分配给线程的ID 
    );
    ---- 第 一 个 参 数 是 安 全 属 性, 一 般 设 为nil, 使 用 缺 省 的 安 全 属 性。 当 我 们 想 此
    线 程 有 另 外 的 子 进 程 时, 可 改 变 它 的 属 性。 
    ---- 第 二 个 参 数 是 线 程 堆 栈 尺 寸, 一 般 设 为0, 表 示 与 此 应 用 的 堆 栈 尺 寸 相
    同, 即 主 线 程 与 创 建 的 线 程 一 样 长 度 的 堆 栈。 并 且 其 长 度 会 根 据 需 要 自 动
    变 长。 
    ---- 第 三 个 参 数, 也 是 最 重 要 的 一 个, 是 一 个 指 向 函 数 名 的 指 针, 但 传 递 时
    很 简 单, 只 需 在 线 程 函 数 名 前 加 上@ 就 可 以 了。 
    ---- 第 四 个 参 数 是 你 需 要 向 线 程 函 数 传 递 的 参 数, 一 般 是 一 个 指 向 结 构 的 指
    针。 不 需 传 递 参 数 时, 则 这 个 参 数 设 为nil。 
    ---- 第 五 个 参 数, 传 入 与 线 程 有 关 的 一 些 标 志, 如 果 是CREATE_SUSPENDED, 则 创 建
    一 个 挂 起 的 线 程, 即 这 个 线 程 本 身 已 创 建, 它 的 堆 栈 也 已 创 建。 但 这 个 线
    程 不 会 被 分 配 给CPU 时 间, 只 有 当ResumeThread 函 数 被 调 用 后 才 能 执 行; 当 然,
    也 可 以 调 用SuspendThread 函 数 再 次 挂 起 线 程。 要 是 标 志 为0, 那 么 一 旦 建 立 线
    程, 线 程 函 数 就 被 立 即 调 用。 一 般 传 为0 即 可。 
    ---- 最 后 一 个 参 数 是 系 统 分 配 给 这 个 线 程 的 唯 一 的ID 标 志。 
    ---- 下 面 这 个 程 序MyThreadPro.pas 介 绍 了 线 程 如 何 建 立 及 使 用: 
    //Your first test Thread Program.
    unit MyThreadPro;
    interface
    uses
    Windows, Messages, SysUtils, Classes, 
    Graphics, Controls, Forms, Dialogs,
    StdCtrls;
    type
    TForm1 = class(TForm)
    UsedThread: TButton;
    NoUsedThread: TButton;
    procedure UsedThreadClick(Sender: TObject);
    procedure NoUsedThreadClick(Sender: TObject);
    var
    Form1: TForm1;
    implementation
    {$R *.DFM}
    //这是线程函数,
    它可以放在下面程序的任何地方
    function MyThreadFunc(P:pointer):Longint;stdcall;
    var
    i:integer;
    DC:HDC;
    S:string;
    begin
    DC:=GetDC(Form1.Handle);
    for i:=0 to 100000 do begin
    S:=Inttostr(i);
    Textout(DC,10,10,Pchar(S),length(S));
    end;
    ReleaseDC(Form1.Handle,DC);
    end;
    procedure TForm1.UsedThreadClick(Sender: TObject);
    var
    hThread:Thandle;//定义一个句柄
    ThreadID:DWord;
    begin
    //创建线程,同时线程函数被调用
    hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
    if hThread=0 then
    messagebox(Handle,'Didn’t Create a Thread',nil,MB_OK);
    end;
    procedure TForm1.NoUsedThreadClick(Sender: TObject);
    begin
    MyThreadfunc(nil); 
    //没有创建线程时,直接调用线程函数
    end;
    end.
      

  5.   

    好了,可以了,刚刚学,什么都不懂,谢谢大家,特别是delphi_han(小强),打了这么多的字很辛苦啊。