저도 비슷한 문제로 쓰레드를 사용해서 해결했습니다.
쓰레드 이용시 쓰레드 내부에서 ADO 관련 컴포넌트를 사용하기 위해서는 사용하시는 함수(대부분 Execute에서 하겠죠) 처음에 CoInitialize(nil);을 호출해 주시고, 함수 종료전에 CoUninitialize;를 호출해 주셔야 CoInitialize가 호출되지 않았다는 오류가 발생하지 않습니다.
네.. ADOQuery객체를 6개를 사용했습니다.
쿼리 오류는 아닙니다. 데이터를 잘 가져오고 있거든요..
버튼을 클릭하면 DB Server에 접속해서 데이터를 가져오는데 가져오는 동안은 프로그램이 어떠한 작동도 하질 않습니다.
한마디로 먹통이 되어 버립니다.
데이터를 가져온 후는 잘 작동하고요...
쿼리가 복잡해서 그런지..아니면 다른 것 때문에 그런지 알고 싶습니다.
제 생각으로는 쿼리를 쓰레드로 처리하면 될것 같기도 한데... 제가 확실히 아는 것도 없고요...
음 일단 정확한건 델파이에서 Query를 쓸경우 Async방식이 아닌 Block 걸
리는 Sync방식이라 그렇게 시간이 걸려서 그런경우라면 쓰레드를 써서
데이타를 가져온후 데이타셋에 채우고 이벤트를 발생시키는 방법밖에는 없겠군요..
일단
(1)호출를 하는 쪽에서
TNotifyEvent = procedure(ds:TDataSetl) of object;
TDBRunThread = class(TThread)
private
FDBEndEvent : TNotifyEvent;
Qry:TSqlQuery;
public
procedure Execute; override;
published
property DBEndEvent:TNotifyEvent read FDBEndEvent write FDBEndEvent;
end;
이럭식으로 해서 만들고
TForm1.Button1Click(sender:Tobject);
var
DBThread:TDBRunThread;
begin
DBThread:=TDBRunThread.Creat;
DBThread.DBEndEvent:=DBRunningEnd;
DBThread.Resume;
end
TForm1.DBRunningEnd(ds:TDataSet);
begin
//여기에서 데이타 표시
저도 비슷한 문제로 쓰레드를 사용해서 해결했습니다.
쓰레드 이용시 쓰레드 내부에서 ADO 관련 컴포넌트를 사용하기 위해서는 사용하시는 함수(대부분 Execute에서 하겠죠) 처음에 CoInitialize(nil);을 호출해 주시고, 함수 종료전에 CoUninitialize;를 호출해 주셔야 CoInitialize가 호출되지 않았다는 오류가 발생하지 않습니다.
그럼, 즐프~