_beginthreadex 线程 函数 解决假死

来源:互联网 发布:linux源码怎么看 知乎 编辑:程序博客网 时间:2024/04/29 05:04

.h文件中添加:
public:
HANDLE Exit_CS;

.cpp文件构造函数添加:
A::A(CWnd* pParent /*=NULL*/)
: CDialog(A::IDD, pParent)
{
//{{AFX_DATA_INIT(A)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
Exit_CS = ::CreateEvent( NULL, TRUE, FALSE, NULL );
}

析构函数中添加:
A::~A()
{
::SetEvent( Exit_CS );
}



如果你想把
int A::Save(CString cs) //有假死
{
//内容
}
Save函数线程化


可以
在.h文件中添加:
UINT WINAPI Deal_Save(LPVOID pSrt);声明
在.cpp文件中这样改:
int flagSort == 0;//连续点击Save按钮,保证只有一次线程执行
int A::Save(CString cs)
{
if(flagSort == 0)
{
flagSort = 1;
UINT uiThreadID;
HANDLE hThread = (HANDLE)_beginthreadex( NULL, 0, Deal_Save, this, 0, &uiThreadID );
if(hThread)
{
::CloseHandle( hThread );
}
}
}
UINT WINAPI A::Deal_Save(LPVOID pSrt)
{
*psort = (A*)pSrt;
//内容
//(这时类内的成员函数、成员变量,前面都要加上 psort  ->  ,函数里的所有for(int j.....)循环内,都加上
// if ( j != 0 && ( j % 15 == 0 )) //15可变
// {
// WaitForSingleObject( psort->Exit_CS, 1 );//1可变
// }
//)
flagSort = 0;
return 0;
}

最后,学的不精,欢迎高手指教