我使用ADO / MSSQL数据库在多线程中进行了基本的类设计 完整的课程设计为here
基本的线程代码是这样的:
constructor PaintBitmapThread.Create(bmp_width, bmp_height: Integer;
server, databasename, tablename, sqlstr: String; ThreadId: Integer);
begin
FBitmap :=TBitmap.create;
FBitmap.Width := bmp_width;
FBitmap.Height := bmp_height;
FBitmap.PixelFormat := pf24bit;
FConnection :=TAdoConnection.Create(nil);
fserver := server;
fdatabasename := databasename;
ftablename := tablename;
FConnection.LoginPrompt := false;
ConnecttoDatabase(fserver, fdatabasename, FConnection)
end;
destructor PaintBitmapThread.destroy;
begin
FBitmap.Free;
FConnection.Free;
inherited;
end;
procedure PaintBitmapThread.Execute;
var
ThreadQuery : TADOQuery;
k : integer;
begin
inherited;
CoInitialize(nil) ; //CoInitialize was not called
ThreadQuery := TADOQuery.Create(nil) ;
try
// ADO DB THREAD MUST USE OWN CONNECTION
ThreadQuery.Connection := FConnection;
ThreadQuery.CursorLocation := clUseServer;
ThreadQuery.LockType := ltReadOnly;
ThreadQuery.CursorType := ctOpenForwardOnly;
ThreadQuery.SQL.Text := FSQLStr;
ThreadQuery.Open;
while NOT ThreadQuery.Eof and NOT Terminated do
begin
//Canvas Does NOT Allow Drawing if not called through Synchronize
//Synchronize(RefreshCount) ;
ThreadQuery.Next;
end;
finally
ThreadQuery.Free;
end;
CoUninitialize()
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
fserver := 'localhost\sqlexpress';
fdatabase := 'test_wbbugfix';
ftable := 'obj';
ServerEdit.Text := fserver;
DatabaseEdit.Text := fdatabase;
TableEdit.Text := ftable
end;
在离开thread.create构造函数之前,我得到一个像下面的屏幕转储一样的AV,
我的代码有什么问题???
答案 0 :(得分:4)
错误消息说明这里有什么问题。
您正在创建将CreateSuspended
参数设置为False
的线程。
这意味着线程将在调用构造函数后立即启动。
任何对Start
的调用都会导致此异常。
<强>解决方案强>
创建CreateSuspended
标志设置为True
的线程。
现在,您可以启动调用Start
方法的线程。
除了这个问题,我想指出你的TADOConnection
和TADOQuery
不在同一个帖子上。这是因为PaintBitmapThread
构造函数在创建PaintBitmapThread
线程对象的线程的上下文中执行。您可以通过在Execute
方法中移动连接构造代码来解决此问题。