这是线程函数: 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;
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;按以上代码一点问题都没有!
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;
WM_THREDMSG = WM_USER + 1;这不是声明消息了吗? 你没看清楚吧
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;
即可解决
2. 用begingthread或TThread或IsMultiThread := true
3. 传引用/传指针/传值三者的本质要搞清楚