mfc 线程如何控制的问题?

jjaldfsa 2010-06-30 10:01:46
做一个查询,想先创建一个线程,等点击查询按钮,触发线程工作,等查完让线程停止,线程ThreadFroc中为一个do{}while(1);但是现在控制不了,请高手指点;
补充:现在我是在do{}while();中做个标记,点击button,标记为true,但只能控制一次查询,而后就控制不了了,查询数据有大有小;
...全文
192 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
quwei197874 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
用事件对象啊:HANDLE event;
waitforsingleobject(event,INFINITE)


BUTTON中:
SetEvent(event);
[/Quote]++
昨夜无风 2012-06-12
  • 打赏
  • 举报
回复
用事件对象啊:HANDLE event;
waitforsingleobject(event,INFINITE)


BUTTON中:
SetEvent(event);
jjaldfsa 2010-06-30
  • 打赏
  • 举报
回复
button事件中的代码
void CQueryDlg::OnBnClickedButtonQuery()
{
InitializeCriticalSection(&g_cs);
MTVERIFY(m_hRunObject = ::CreateEvent(NULL,TRUE,0,"CQueryDlg::g_hRunObject"));
DWORD dwThreadID;
if (m_hRequestData == NULL)//创建线程
{
MTVERIFY( m_hRequestData = CreateThread( NULL, 0, ThreadFroc, (void *)this, 0, &dwThreadID ) );
}
//Sleep(1);
if (m_hRequestData != NULL)//删除线程句柄
{
MTVERIFY(WaitForSingleObject(m_hRequestData,INFINITE) != WAIT_FAILED);
CloseHandle(m_hRequestData);
m_hRequestData = NULL;
}
}
线程中的代码
DWORD WINAPI CQueryDlg::ThreadFroc(void *pPara)
{
CQueryDlg *pDlg = (CQueryDlg *)pPara;
EnterCriticalSection(&g_cs);
pDlg->LogSearch();//查询兼打印函数
Sleep(1);
LeaveCriticalSection(&g_cs);
return 0;
}
reality 2010-06-30
  • 打赏
  • 举报
回复
看看代码吧
jjaldfsa 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fangchao918628 的回复:]
当你查询完成后,要将标记设置为FALSE,你在每次查询的时候有判断线程是否还在查询么??(也就是TRUE FALSE),这时候要做等待处理的....
按照3楼的方法就可以了,用同步应该也行
[/Quote]
没用while;使用临界区,但只能查一次,而后线程一直运行
fangchao918628 2010-06-30
  • 打赏
  • 举报
回复
当你查询完成后,要将标记设置为FALSE,你在每次查询的时候有判断线程是否还在查询么??(也就是TRUE FALSE),这时候要做等待处理的....
按照3楼的方法就可以了,用同步应该也行
jjaldfsa 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bragi523 的回复:]
你是要查询完立刻退出?
既然你的查询都是在线程内做的,就不需要while(1)了,做完直接退出
[/Quote]
是想查完让线程停止,再次点击查询再触发线程
不用while(1)就怕数据很大,还没查完,时间片就切换了
bragi523 2010-06-30
  • 打赏
  • 举报
回复
你是要查询完立刻退出?
既然你的查询都是在线程内做的,就不需要while(1)了,做完直接退出
jjaldfsa 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 initialj 的回复:]
为什么不在点击按钮的时候创建线程呢?
[/Quote]
那不是每次查询都要创建线程?
这样也不知道怎么关
InitialJ 2010-06-30
  • 打赏
  • 举报
回复
为什么不在点击按钮的时候创建线程呢?
jjaldfsa 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fangchao918628 的回复:]
C/C++ code

if (m_hRequestData != NULL)//删除线程句柄
{
//WaitForSingleObject(m_hRequestData,INFINITE) != WAIT_FAILED;

CloseHandle(m_hRequestData);
m_hRequestData = NULL;

}

你这样写有问题吧....创建后没有等……
[/Quote]
是有问题,想在窗口关闭的时候关闭句柄,中间用挂起线程恢复线程,但是控制不了,不知道什么时候挂起,什么时候恢复
fangchao918628 2010-06-30
  • 打赏
  • 举报
回复

if (m_hRequestData != NULL)//删除线程句柄
{
//WaitForSingleObject(m_hRequestData,INFINITE) != WAIT_FAILED;

CloseHandle(m_hRequestData);
m_hRequestData = NULL;

}
你这样写有问题吧....创建后没有等线程结束就CloseHandle
你是怎么停止线程的...挂起,还是杀掉?
没有看见控制线程的代码
jjaldfsa 2010-06-30
  • 打赏
  • 举报
回复
一样,线程停止不了,拼命执行这里面的函数
EnterCriticalSection(&g_csMapTermIPToSock);
。。。。。。。
LeaveCriticalSection(&g_csMapTermIPToSock);
reality 2010-06-30
  • 打赏
  • 举报
回复
void CFdsafdDlg::OnButton3()
{
// TODO: Add your control notification handler code here

//MTVERIFY(m_hRunObject = ::CreateEvent(NULL,TRUE,0,"CQueryDlg::g_hRunObject"));
DWORD dwThreadID;
if (m_hRequestData == NULL)//创建线程
{
m_hRequestData = CreateThread( NULL, 0, ThreadFroc, (void *)this, 0, &dwThreadID ) ;
}
if (m_hRequestData != NULL)//删除线程句柄
{
//WaitForSingleObject(m_hRequestData,INFINITE) != WAIT_FAILED;

CloseHandle(m_hRequestData);
m_hRequestData = NULL;

}
}
DWORD __stdcall CFdsafdDlg::ThreadFroc(void *pPara)
{
CFdsafdDlg *pDlg = (CFdsafdDlg *)pPara;
EnterCriticalSection(&g_csMapTermIPToSock);
for(int i=0;i<3;i++)
{
AfxMessageBox("aaaaaaaaa");
Sleep(3000);
}

LeaveCriticalSection(&g_csMapTermIPToSock);

return 0;
}
看看这样可以不
Eleven 2010-06-30
  • 打赏
  • 举报
回复
线程里不要传递MFC类的指针,改用窗口句柄,你的线程里写个消息循环,如果你想线程完成一次查询以后不退出的话,再次查询的时候,直接PostThreadMessage既可。。。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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