ConnectionStr:string;    这种类型 string最好定义PCharCreateThread 使用这个函数创建函数要使用IsMultiThread := true不知道你的 lTsql:=lSql.GetVipConfig;  这个如何实现! 其实把lTSql:  PSqlConfig; 直接new(lTSql)  后赋值传递不就完事了! 
                

解决方案 »

  1.   

    const
      WM_THREDMSG = WM_USER + 1;  TSqlConfig = record
        formhandle: Cardinal; //窗口句柄
        {数据库连接字符串}
        ConnectionStr:string;
        {Sql语句}
        SqlStr:string;
        {数据库表}
        DateBaseName:string;
        {Sql参数}
        SqlParameters:string;
        {Sql从某行取}
        StartPoint:string;
        {Sql取多少行}
        Count:string;
      end;  PSqlConfig=^TSqlConfig;private
        procedure WMTHREDMSG(var msg: TMessage); message WM_THREDMSG;
    var
         ghEvent: THandle;procedure TForm1.CreateVipThread;
    var
      I:integer;
      lTsql: PSqlConfig;
      ThreadId: DWORD;
      vThread: THandle;
    begin
      IsMultiThread := True;
      new(lTsql);
      lTsql.formhandle := Self.Handle;
      lTsql.ConnectionStr := 'ADO connectstring';
      vThread := CreateThread(nil, 0, @VipThreadProc, lTsql, 0, ThreadId);
      ghEvent := CreateEvent(nil, False, False, nil);
      CloseHandle(vThread);
    end;procedure TForm1.WMTHREDMSG(var msg: TMessage);
    begin
      Memo1.Lines.Add(PSqlConfig(msg.LParam).ConnectionStr);
      Dispose(PSqlConfig(msg.LParam));
    end;按以上代码一点问题都没有! 
      

  2.   

      这是线程函数:
    function VipThreadProc(sSqlConfig:PSqlConfig): Integer; stdcall;
    var
      Ret:Boolean;
      MAX_WAIT_TIMEOUT:Integer;
    begin
      Result := 0;
      MAX_WAIT_TIMEOUT:=1000;
      while WaitForSingleObject(ghEvent, MAX_WAIT_TIMEOUT) = WAIT_TIMEOUT do
      begin
        PostMessage(sSqlConfig.formhandle, WM_THREDMSG, 0, dword(sSqlConfig));
        //ShowMessage(sSqlConfig.ConnectionStr);
        Sleep(1);
        Break;
        {提交}
      end;
      result:= 0;end;
      

  3.   

    麻烦能写清楚点么,没看懂  PostMessage(sSqlConfig.formhandle, WM_THREDMSG, 0, dword(sSqlConfig));这个要声明歌消息?
      

  4.   

    const
      WM_THREDMSG = WM_USER + 1;这不是声明消息了吗? 你没看清楚吧
      

  5.   

    你把
    type
       TSqlConfig = record
         {数据库连接字符串}
         ConnectionStr:string;
         {Sql语句}
         SqlStr:string;
         {数据库表}
         DateBaseName:string;
         {Sql参数}
         SqlParameters:string;
         {Sql从某行取}
         StartPoint:string;
         {Sql取多少行}
         Count:string;
       end;
    定义为
    type
       TSqlConfig = record
         {数据库连接字符串}
         ConnectionStr:array [0..1024 - 1]of char;
         {Sql语句}
         SqlStr:array [0..1024 - 1]of char;
         {数据库表}
         DateBaseName:array [0..1024 - 1]of char;
         {Sql参数}
         SqlParameters:array [0..1024 - 1]of char;
         {Sql从某行取}
         StartPoint:array [0..1024 - 1]of char;
         {Sql取多少行}
         Count:array [0..1024 - 1]of char;
       end;
     即可解决
      

  6.   

    1. 仔细考虑string的引用计数特性
    2. 用begingthread或TThread或IsMultiThread := true
    3. 传引用/传指针/传值三者的本质要搞清楚