对话框中创建线程 对话框响应按钮消息时 线程就不执行了吗 直到按钮消息相应完?

tigerMayDo 2011-01-27 10:15:33
对话框中创建线程 对话框相应按钮消息时
比如我按钮sleep(3000) 此时线程就不执行了吗 直到按钮消息相应完?
这是怎么回事
...全文
341 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wltg2001 2011-01-27
  • 打赏
  • 举报
回复
我在停止线程中有setevent应该线程中就会停止返回了,但是却仍然执行了TerminateThread函数
======
代码太长了,没仔细看,你可以在中止线程函数中用WaitForSingleObject等待线程句柄,这样就可以不用Sleep了。
tigerMayDo 2011-01-27
  • 打赏
  • 举报
回复

DWORD WINAPI UpdateDtbb(void* lpvoid) //线程函数
{
CFzzqJCJDlg *dlg = (CFzzqJCJDlg*)lpvoid;
g_db_report=new CADODatabase;

if (g_db_report==NULL)
return 0;

ReadIniSettings();
CString strConnection_report,strtips;
strConnection_report.Format("Provider=OraOLEDB.Oracle.1;Data Source=%s;Persist Security Info=False",g_IniSettings.Server_DB.szDBName);
if (!g_db_report->Open(strConnection_report,g_IniSettings.Server_DB.szUser,g_IniSettings.Server_DB.szPwd))
{
delete g_db_report;
g_db_report=NULL;
strtips = "数据库连接失败";
dlg->AppendLog(strtips);
dlg->GetDlgItem(IDC_QUIT)->EnableWindow(TRUE);
dlg->GetDlgItem(IDC_CONFIG)->EnableWindow(TRUE);
return 0;
}
else
{
strtips = "数据库连接成功";
dlg->AppendLog(strtips);
}

CString strDate,szTitle,strValue;
CString strSql;
/////////////////////////////////最后修改日期 债券代码 债券名称 票面利率
strSql.Format("select * from tzjc_signals");
CADOCommand adoCmdGyzx(g_db_report,strSql,CADOCommand::CmdText);
CADORecordset adoRsGyzx(g_db_report);
if (!adoRsGyzx.Execute(&adoCmdGyzx))
{
strtips = "数据库查询失败";
dlg->AppendLog(strtips);
dlg->GetDlgItem(IDC_QUIT)->EnableWindow(TRUE);
dlg->GetDlgItem(IDC_CONFIG)->EnableWindow(TRUE);
return 0;
}
else
{
strtips = "数据库查询成功";
dlg->AppendLog(strtips);
}
int nReportNum=adoRsGyzx.GetRecordCount();
strtips.Format("表tzjc_signals共有%d条数据记录",nReportNum);
dlg->AppendLog(strtips);
if(nReportNum<=0)
{
adoRsGyzx.Close();
Sleep(5);
return 0;
}
adoRsGyzx.MoveFirst();
for (int i =0;i<nReportNum && !adoRsGyzx.IsEof();adoRsGyzx.MoveNext(),i++)
{
if (WaitForSingleObject(event_stop1,0)==WAIT_OBJECT_0)
return 1;
adoRsGyzx.GetFieldValue("tradeday",strValue);
strtips.Format("记录%d交易日:%s",i+1,strValue);
dlg->AppendLog(strtips);
}
strtips = "查询结束";
dlg->AppendLog(strtips);
dlg->GetDlgItem(IDC_QUIT)->EnableWindow(TRUE);
dlg->GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
dlg->GetDlgItem(IDC_CONFIG)->EnableWindow(TRUE);

return 1;
}

void CFzzqJCJDlg::OnStart() //按钮消息 创建线程
{
GetDlgItem(IDC_CONFIG)->EnableWindow(FALSE);
GetDlgItem(IDC_QUIT)->EnableWindow(FALSE);
CString strtips;
strtips = "开始连接数据库...";
AppendLog(strtips);
event_stop1 = CreateEvent(NULL, TRUE, FALSE, NULL);
ThreadHandle1 = CreateThread(NULL,1024,(LPTHREAD_START_ROUTINE)UpdateDtbb,this,0,NULL);
}

void CFzzqJCJDlg::OnStop() //按钮消息 停止线程
{
CString strtips;
GetDlgItem(IDC_QUIT)->EnableWindow(FALSE);
strtips.Format("正在停止...请稍候");
AppendLog(strtips);
SetEvent(event_stop1);
BOOL bGetCode;
DWORD nExitCode;
Sleep(500);
bGetCode= GetExitCodeThread(ThreadHandle1,&nExitCode);
strtips = "获取到线程1退出码";
AppendLog(strtips);
if(!bGetCode||STILL_ACTIVE==nExitCode)
{
DWORD dwTmp=WaitForSingleObject(ThreadHandle1,3000);//等待3000的时间,让句柄(事件)执行完,返回WAITE_OBJECT_0或者WAITE_TIMEOUT
if (dwTmp!=WAIT_FAILED && dwTmp!=WAIT_OBJECT_0)
{
strtips = "正在执行线程1退出";
AppendLog(strtips);
TerminateThread(ThreadHandle1 , 0); //终止线程
CloseHandle(ThreadHandle1);
}
}
bGetCode= GetExitCodeThread(ThreadHandle1,&nExitCode);
strtips = "线程1已退出";
AppendLog(strtips);
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
GetDlgItem(IDC_QUIT)->EnableWindow(TRUE);
GetDlgItem(IDC_CONFIG)->EnableWindow(TRUE);
}

我在停止线程中有setevent应该线程中就会停止返回了,但是却仍然执行了TerminateThread函数
wltg2001 2011-01-27
  • 打赏
  • 举报
回复
你的Sleep放在哪儿的啊?如果是放在按钮的函数中的,那么并不会影响线程的执行。
你上面说得不清楚,上点代码吧
tigerMayDo 2011-01-27
  • 打赏
  • 举报
回复
创建的时候我将窗口指针传给了线程 然后在线程中操作了按钮的变灰 以及 edit的数据显示
见习学术士 2011-01-27
  • 打赏
  • 举报
回复
不会哦。
是不是你在线程中结束的时候又发送消息到窗口或者操作了窗口,如果是这样的话,那就是要等sleep完了才能响应你这个线程操作窗口的消息了。
tigerMayDo 2011-01-27
  • 打赏
  • 举报
回复
我的线程函数传了个对话框的this指针 是不是因为这个就阻塞了
欣客 2011-01-27
  • 打赏
  • 举报
回复
WaitForSingleObject(ThreadHandle1,3000);
改成
WaitForSingleObject(ThreadHandle1, INFINITE);
看看会不会返回,

有可能是时间太短了,如果不能返回说明线程在某个地方阻塞了。
nasasaga 2011-01-27
  • 打赏
  • 举报
回复
我在vs008下试了下 这样的结束线程逻辑没啥问题 没有进入terminate函数中

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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