[★★★]问一个关于多线程编程的问题
在一个线程中实现数据库查询,完成查询之后自己释放。
主窗口需要知道此线程的查询是否完成,该如何判断呢?
推荐阅读
做一个回调函数,在线程结束时,让线程调用主窗体中能够的该函数。
我认为:基本上用bcb做多线程的东西尤其是用vcl时是很费劲的。
可以试试用下面的方法:
bool stopflag;//判断查询是否结束
void messdetect()//
{
msg mess;
while(::peekmessage(&mess,null,0,0,pm_remove)) {
::translatemessage(&mess);
::dispatchmessage(&mess);
}
}
用sendmessage函数在数据库查询线程中发送一个自定义消息wm_user1;
hwnd hwnd;
copydatastruct cpd;
......
::sendmessage(hwnd,wm_user1,null,(lparam)&cpd);
再做一个wm_user1消息的处理函数,
void __fastcall tform1::win_user1(tmessage &message)
{
......
stopflag=true;//查询结束
......
}
主线程中可以如下:
......
stopflag=false;
if (_beginthread(newthread,4096,null) == -1) return;//开始新线程
while(1){
messdetect();//等待查询结束
if(stopflag)break;
}
......
线程的查询完成时给主窗体发个消息也可以实现。
sendmessage(main->handle,wm_yourdefine,1,0);
主窗体中处理此消息
.h
public:
void __fastcall yourfunc(tmessage& msg);
begin_message_map
vcl_message_handler(wm_yourdefine, tmessage, yourfunc)
end_message_map(tform);
.cpp
void __fastcall main::yourfunc(tmessage& msg)
{
if (((int)msg.wparam)==1)
....
//your process
}
sendmessage
.

讨论区