多线程通过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
请高手指教,万分感谢
...全文
271 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
choge 2016-01-12
  • 打赏
  • 举报
回复
c++builder,放在那边半个月没人理,想到delphi和cb是相通的,所以到这里求助。
cuixd2020 2016-01-12
  • 打赏
  • 举报
回复
这是CB吧?
lyhoo163 2016-01-12
  • 打赏
  • 举报
回复
帖子贴错了地方,这是C语言的。
缘中人 2016-01-12
  • 打赏
  • 举报
回复
这个就不要用线程了
Andy-88 2016-01-12
  • 打赏
  • 举报
回复
这个是SQL 语句有问题 或是GRID 有问题,时间久了记不清楚了 我绝对遇到 过这种问题,你换一个GRID 试试

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧