求CreateThread 参数传递!(100分)

  • 主题发起人 主题发起人 顺顺
  • 开始时间 开始时间

顺顺

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TSQLData = packed record
SQLBuf : array [0..511] of Char;
RecordCount: DWORD;
end;
pSQLData = ^ TSQLData;
function ThreadExecSQL(_sSQL:String):integer;
var
dwThreadId:DWORD;
hThread :THANDLE;
sSQLData :pSQLData;
function LogExecSQL(sSQLStr:pSQLData):integer;
var
ADOQuerySQLExec :TADOQuery;
//sSQLStr :TSQLBuf;
begin
try
//MoveMemory(@sSQLStr,pSQL,SizeOf(TSQLBuf));
ShowMessage(sSQLStr.SQLBuf);
Result:=0;
ADOQuerySQLExec:=TADOQuery.Create(nil);
with ADOQuerySQLExecdo
begin
Close;
Connection:=DM.Conn;
SQL.Clear;
SQL.Add(sSQLStr);
ExecSQL;
Close;
Free;
end;
except
end;
end;

begin
try
New(sSQLData);
StrPCopy(sSQLData.SQLBuf,_sSQL);
hThread := CreateThread(
nil, 0, @LogExecSQL,@sSQLData, 0, dwThreadId
);
except
on E:Exceptiondo
ShowMessage(e.Message);
end;
end;

我的大意是要用线程执行无返回的sQL语句, 可我不知道用CreateThread的参数怎么传递.
就是传 送 SQL语句到 LogExecSQL中. 请各位大哥多多指点
 
很简单,你将SQL语句存放在公共TStringList队列中,因为线程可以随时监控,所以只要其Count>0线程就会自动执行
 
re dey-999
这个方法我知道,只是我对 Createthread 的参数引用 (或者说是指针/结构 引用)不了解.不知其所然啊.
哎~只怪自己太肉了.
不过还是谢谢你给我解答.
 
找到问题解决方案了~ 呵呵呵~ 最后的更改结果
function LogExecSQL(const pSQLStr:String):integer;stdcall;
var
ADOQuerySQLExec :TADOQuery;
begin
try
//
MessageBox(0, PChar(pSQLStr), '调试', MB_ICONINFORMATION + MB_OK);
//
ADOQuerySQLExec:=TADOQuery.Create(nil);
with ADOQuerySQLExecdo
begin
Close;
Connection:=DM.Conn;
SQL.Clear;
SQL.Add(pSQLStr);
ExecSQL;
Close;
Free;
end;
except
on E:Exceptiondo
begin
if ADOQuerySQLExec.Active then
begin
ADOQuerySQLExec.Close;
ADOQuerySQLExec.Free;
end;
logSysADD(E.Message);
Result:=-1;
end;
end;
end;

function ThreadExecSQL(_sSQL:String):integer;
var
dwThreadId:DWORD;
hThread :THANDLE;
sSQLData :pSQLData;
begin
try
//修改字符串引用计数,欺骗delphi,防止传递的参数FileName被自动释放
if pinteger(integer(_sSQL)-8)^ >= 0 then
inc(pinteger(integer(_sSQL)-8)^);
//创建线程监视程序运行, 返回值为线程ThreadID, 你可以通过TerminateThread终止该线程
hThread := CreateThread(
nil, 0, @LogExecSQL,pointer(_sSQL), 0, dwThreadId
);
closehandle(hThread);
except
on E:Exceptiondo
ShowMessage(e.Message);
end;
end;
 
type
pdata=^Tdata
Tdata=record
x:integer;
y:integer;
end;

----------
---------
implementation
--------
-------
procedure ThreadExec;
var
threadhandle:THandle;
threadid:dword;
data:pdata;
begin
new(data);
data^.x:=10;
data^.y:=20;
threadhandle := CreateThread(nil,0,@Exec,data,0,threadid);
end;
 
后退
顶部