多线程如何使用ADOQuery啊?

Lersh 2002-05-31 04:31:24
源程序如下:(省略了ConnectionString)

#include <vcl.h>
#pragma hdrstop

#include "Test.h"
#include "MyThread.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
MyThread *ADOThread;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall MyThread::Execute()
{
TADOQuery *ADO=new TADOQuery(NULL);
ADO->ConnectionString="...";
ADO->SQL->Text="Select TOP 100 * from lttitle";
ADO->Open();
Form1->Memo1->Lines->Clear();
while(!ADO->Eof)
{
Form1->Memo1->Lines->Add(ADO->FieldByName("title")->AsString);
ADO->Next();
} //---- Place thread code here ----
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ADOThread=new MyThread(true);
ADOThread->FreeOnTerminate=true;
}


MyThread.cpp

#ifndef MythreadH
#define MythreadH
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class MyThread : public TThread
{
private:
protected:
void __fastcall Execute();
public:
__fastcall MyThread(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif




MyThread.cpp

#include <vcl.h>
#pragma hdrstop

#include "Mythread.h"
#pragma package(smart_init)

__fastcall MyThread::MyThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
FreeOnTerminate=true;
Resume();
}
//---------------------------------------------------------------------------
这个程序只要一点Button2就会显示“标记没有引用储存”,这是怎么回事啊?
...全文
195 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
youhony 2003-01-18
  • 打赏
  • 举报
回复
hehe,要重新考虑思路!
yangguo_god 2003-01-18
  • 打赏
  • 举报
回复
学习,呵呵,mark
halibut 2003-01-18
  • 打赏
  • 举报
回复
多线程访问VCL控件要使用
Synchronize
zzhong2 2003-01-18
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1248/1248278.xml?temp=.7255518

那是你使用了 COM
在创建时使用 CoInitialize(NULL);
释放时使用 CoUninitialize();
如:【在 Dll 中使用 Excel】
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH: //初始化 COM
CoInitialize(NULL);
break;
case DLL_PROCESS_DETACH: //释放 COM
CoUninitialize();
break;

case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}
以上是引用别人的回贴
halfdream 2003-01-18
  • 打赏
  • 举报
回复
再补充一下,
尽量不要在非主线程里面直接访问FORM上面涉及显示的对象,
可以改为POST异步消息给主线程(或者不发消息,让主线程定时
取数据显示),让主线程主动去取数据显示。
halfdream 2003-01-18
  • 打赏
  • 举报
回复
调用的时候,去掉Synchronize
halfdream 2003-01-18
  • 打赏
  • 举报
回复
void __fastcall MyThread::Execute()
{
CoInitliaze(0); //线程里面使用COM调用,初始化COM环境是绝不能少的

.....
.....

CoUninitlize();
}
xiaojianw 2003-01-18
  • 打赏
  • 举报
回复
mark
Lersh 2002-06-06
  • 打赏
  • 举报
回复
异步如何用啊,为什么下面的程序一执行就会出错?ADO是异步:


ADOQuery1->Connection=Form1->ADOConnection1;
ADOQuery1->SQL->Text="Select TOP 500 * from lttitle Order by datee";
ADOQuery1->Open();
Form1->Memo1->Lines->Clear();
while(!ADOQuery1->Eof)
{
Form1->Memo1->Lines->Add(ADOQuery1->FieldByName("title")->AsString) ;
ADOQuery1->Next();
}
ADOQuery1->Close();
ADOQuery1->Free();
wyb_45 2002-06-03
  • 打赏
  • 举报
回复
我在使用Socket通讯的时候,就使用的ADOQuery,是动态new的,Socket是多线程的,因此,在多线程里使用ADOQuery,应该是没有问题。
我可以保证。
Lersh 2002-06-03
  • 打赏
  • 举报
回复
这样就可以拖动窗体了?我现在无法试验,周末给分
sncel 2002-06-03
  • 打赏
  • 举报
回复
ADO异步查询:
ADOQuery1中ExecuteOptions属性中的eoAsyncExecute=true
Lersh 2002-06-03
  • 打赏
  • 举报
回复
谢谢楼上的,你能帮我改一下吗,如何才能使查询时能拖动窗体?我对同步不了解
wildhorse01 2002-06-03
  • 打赏
  • 举报
回复
在多线程里少使用或者不用同步,否则,会出现你的问题,如:拖动窗体没反应!

线程内产生的数据,你可以定时读取或者其他的方法来交换,如果采用同步的方法,还是“拖动窗体没反应”;
wsljj_2002 2002-06-02
  • 打赏
  • 举报
回复
菜鸟提问,是下面这段实现多线程的么?简单点说多线程是什么?
void __fastcall MyThread::Execute()
{
Synchronize((TThreadMethod)&AddToForm); //在线使用VCL对象请使用Synchronize方法

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ADOThread=new MyThread(true);
ADOThread->FreeOnTerminate=true;
}
Lersh 2002-06-02
  • 打赏
  • 举报
回复
你是说启动时就把ADOConnection设成true?不行的,一样的结果,而且在Memo怎加数据的时候,也不能拖动窗体……
sncel 2002-06-02
  • 打赏
  • 举报
回复
你要等主线程的ADOConnection1连到数据库后才能在子线程中查询,在启动时你可能没有主动打开ADOConnection1,等到子线程进行查询后才将ADOConnection1连接到数据库,这部分是在主线程里完成的所以会造成主线程一下响应不过来,造成消息阻塞,所以会出现这样的情况,你再看看吧
sncel 2002-06-01
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#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:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall MyTestTrend::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------------------------

__fastcall MyTestTrend::MyTestTrend(bool CreateSuspended)
: TThread(CreateSuspended)
{
FreeOnTerminate=true;
}
//---------------------------------------------------------------------------
void __fastcall MyTestTrend::Execute()
{
Synchronize((TThreadMethod)&StartQuery); //在线使用VCL对象请使用Synchronize方法

}
//---------------------------------------------------------------------------
void __fastcall MyTestTrend::StartQuery()
{
TADOQuery *adoQr1=new TADOQuery(NULL);
adoQr1->Connection=Form1->ADOConnection1;
adoQr1->SQL->Text="Select top 10 au_lname from authors order by au_lname";
adoQr1->Open();
Form1->Memo1->Lines->Clear();
while(!adoQr1->Eof)
{
Form1->Memo1->Lines->Add(adoQr1->FieldByName("au_lname")->AsString);
adoQr1->Next();
} //---- Place thread code here ----
adoQr1->Close();
adoQr1->Free();
}
Lersh 2002-06-01
  • 打赏
  • 举报
回复
谢谢,可以运行了,可是在运行时,窗体还是不能拖动,没有起到多线程的作用,这是为什么?
sncel 2002-06-01
  • 打赏
  • 举报
回复
创建程序及启动用请用:

ADOThread=new MyThread(false);//不是true

加载更多回复(8)

13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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