有关多线程取数据的问题,高手们请帮忙,实在没办法了!!!!!!!!!!!!
请问我用以下的方法去取数据为什么不行呀?
自定义消息:
const
THREAD_GETDATA = WM_USER+1;
THREAD_UPDATEDATA = WM_USER+2;
THREAD_TERMINATE = WM_USER+3;
以下是自己定义的多线程类:
TDataThread = class(TThread)
private
FStream: Pointer;
IAppData: IAppServer;
FDelta: OleVariant;
FData: OleVariant;
FcdsData: TClientDataSet;
Function GetData(Fcds: TClientDataSet):OleVariant;
Procedure UpdateData(Fcds: TClientDataSet);
protected
Procedure Execute;override;
public
Constructor Create(Fcds: TClientDataSet);
Property Delta: OleVariant read FDelta write FDelta;
Property Data: OleVariant read FData write FData;
end;
constructor TDataThread.Create(Fcds: TClientDataSet);
var
Res: HRESULT;
begin
FreeOnTerminate := True;
OleCheck(CoInitialize(Nil));
Self.FcdsData := Fcds;
try
Res:= CoMarshalInterThreadInterfaceInStream(IID_IAppserver, //用来注册线程。
FcdsData.AppServer,IStream(FStream)); //OleCheck( )AppInteface:=IappServer(IDispatch(DataModule1.skc1.AppServer));
case res of
E_OUTOFMEMORY:
Dialogs.ShowMessage('There was not enough memory to complete the call.');
E_INVALIDARG:
Dialogs.ShowMessage('One or more arguments are invalid. '); //相当于ShowMessage.
end;
except
On e: Exception do
Begin
CoUninitialize;
Dialogs.ShowMessage(E.Message);
exit;
end;
end;
try
Res:= CoGetInterfaceAndReleaseStream(IStream(FStream),IID_IAppServer,IAppData);
case res of
E_INVALIDARG:
Dialogs.ShowMessage('Indicates that input arguments are invalid.');
end;
except
On e: Exception do
Begin
CoUninitialize;
Dialogs.ShowMessage(E.Message);
exit;
end;
end;
Inherited Create(False);
end;
procedure TDataThread.Execute;
var
Event: THandle;
Msg: TMsg;
cdsTemp: TClientDataSet;
begin
Event:= Self.Handle;
CoInitialize(Nil);
try
While Not Terminated do
begin
case MsgWaitForMultipleObjects(0,Event,False,INFINITE,QS_ALLINPUT) of
WAIT_OBJECT_0:
begin
While PeekMessage(Msg,0,0,0,PM_REMOVE) do
begin
if Msg.hwnd = 0 Then
begin
Case Msg.message of
THREAD_GETDATA:
begin
cdsTemp:=TClientDataSet(Pointer(Msg.wParam));
Self.Data := Self.GetData(cdsTemp);
end;
THREAD_UPDATEDATA:
begin
cdsTemp:=TClientDataSet(Pointer(Msg.wParam));
Self.UpdateData(cdsTemp);
end;
THREAD_TERMINATE:
Terminate;
end;
end;
end;
end;
end;
end;
finally
CoUnInitialize();
end;
end;
function TDataThread.GetData(Fcds: TClientDataSet): OleVariant;
var
ResCount: Integer;
Params: OleVariant;
OwerData: OleVariant;
begin
Result:=IAppData.AS_GetRecords(Fcds.ProviderName,Fcds.PacketRecords,ResCount,1,Fcds.CommandText,Params,OwerData);
end;
procedure TDataThread.UpdateData(Fcds: TClientDataSet);
var
iErrCount: Integer;
OwnerData: OleVariant;
begin
IAppData.AS_ApplyUpdates(Fcds.ProviderName,Fcds.Delta,-1,iErrCount,OwnerData);
end;
调用:
var
DataThread: TDataThread;
我用发送消息的形式:PostThreadMessage(DataThread.ThreadID,THREAD_GETDATA,Integer(Pointer(ClientDataSet1)),0);
来取数据:提老是在SConnect的单元里为提示出一个错误,说什么‘Invalid argument’