如何实现后台计算?我有一个查询数据窗口,打开的时候在CREATE事件中进行一个时间较长的ADO查询运算,这时窗
如何实现后台计算?
我有一个查询数据窗口,打开的时候在CREATE事件中进行一个时间较长的ADO查询运算,这时窗口处于无响应状态。
于是我想将这段ADO查询运算放在一个新线程中后台进行,请教用过的朋友讲一下用法,先谢了。
C/C++ codevoid __fastcall Tfm_HS::FormCreate(TObject *Sender){// 打开必要的数据表环境,这段打开时间较长,能不能后台运行?是用线程呢还是异步ADO?? ADOConnection1->Connected = true; ADOQuery1->Open();}//---------------------------------------
[解决办法]没有这样用过,但是应该可以,线程要有自己的adoconnection,自己的adoquery,在主界面显示数据的时候要用Synchronize
[解决办法]在CREATE事件中可以加条Application->ProcessMessages();
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Button1->Caption = "Ignore Messages";
Button2->Caption = "Handle Message";
}
void __fastcall TForm1::Button1Click(TObject* Sender)
{
int x, y;
Canvas->TextOut(10, 10, "The Button1Click handler has started");
Application->ProcessMessages(); // Force redraw.
Sleep(100);
for (int i = 0; i < magicnumber; i++)
{
Randomize();
for (int j = 0; j < magicnumber; j++)
{
Sleep(10);
y = random(j);
}
x = random(i);
}
Canvas->TextOut(10, 10, "The Button1Click handler is finished ");
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int x, y;
Canvas->TextOut(10, 10, "The Button2Click handler has started");
for (int i = 0; i < magicnumber; i++)
{
Randomize();
for (int j = 0; j < magicnumber; j++)
{
y = random(j);
Sleep(10);
Application->ProcessMessages();
}
x = random(i);
}
Canvas->TextOut(10, 10, "The Button2Click handler is finished ");
}
[解决办法]如果是很复杂的运算可以考虑放到数据库后台去处理,比如建立视图或者存储过程。
[解决办法]你可以在create的时候创建一条线程去处理你的运算。但说实话,我没有太理解楼主要解决的东东。
[解决办法]线程中,取数据总是时间较长的工作,而显示数据相对是比较轻松的工作,将显示数据部分放入同步里
其实不用这么麻烦的,如果只是要显示个Logo,下面的代码可以实现:
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
try
{
LogoForm=new TLogoForm(Application);
LogoForm->Show();
Application->Initialize();
Application->MainFormOnTaskBar = true;
Application->CreateForm(__classid(TForm1), &Form1);
LogoForm->Close();
Application->Run();
......
}
[解决办法]大数据量的运算不建议放在窗体初始化的时候来做。这样会导致窗体初始化的时候界面死掉或者白屏等。
如上楼所说的加 等待窗体,
或者是窗体初始化完成以后,由用户自己来启动这个运算,然后加个状态条,这样会比较友好。