多线程通过adoquery查数据库,结果输出在dbgrid,常常出现“ Canvas does not allow drawing”错误
choge 2016-01-11 09:31:32 主窗体:
#include "Unit2.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TDataSource *DataSource1;
TDBGrid *DBGrid1;
TButton *Button1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
TMyThread *thread1;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
thread1=new TMyThread(true,DataSource1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(thread1->Suspended)
thread1->Resume();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(!thread1->Suspended)
thread1->Suspend();
}
线程文件
//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <ADODB.hpp>
//---------------------------------------------------------------------------
class TMyThread : public TThread
{
private:
AnsiString sql;
TADOQuery *ADOQuery1;
TDataSource *DataSource1;
void __fastcall TMyThread::ConnectDataSource();
protected:
void __fastcall Execute();
public:
__fastcall TMyThread(bool CreateSuspended,TDataSource *DataSource);
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//-----------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended,TDataSource *DataSource)
: TThread(CreateSuspended)
{
sql = "select top 1 * from Data";
DataSource1 = DataSource;
ADOQuery1 = new TADOQuery(Application);
AnsiString DataBase = ExtractFilePath(Application->ExeName)+"TestDB.mdb";
ADOQuery1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+DataBase;
FreeOnTerminate=true;
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
while(!Terminated)
{
CoInitialize(NULL);
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(sql);
try
{
ADOQuery1->Open();
Synchronize(ConnectDataSource);
}
catch(...)
{
ADOQuery1->Close();
MessageBox(0,"线程异常!","出错",MB_ICONSTOP|MB_OK);
}
Suspend();
CoUninitialize();
}
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::ConnectDataSource()
{
DataSource1->DataSet = ADOQuery1;
}
//---------------------------------------------------------------------------
问题:
第一次点击按钮1时,能正常查询和显示。第二次或第三次()查询时会出现如下错误
Canvas does not allow drawing
或者
Grid index out of range
请高手指教,万分感谢