[C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
BOOL runflag; //这个为否正在发送数据的标志
int uiButton; //这个是表明哪一个函数启动的发送线程 的标志
HANDLE m_CANEvent; //事件
CWinThread *pCANThreads; //线程指针
[C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
BOOL CExample2Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
…
…
m_CANEvent=CreateEvent(NULL,FALSE,FALSE,NULL); //声明一个事件
return TRUE; // return TRUE unless you set the focus to a control
}
void CExample2Dlg::OnButton1() //这是一个按钮响应函数,用按钮开启线程的函数
{
// TODO: Add your control notification handler code here3
ResetEvent(m_CANEvent); //设置无信号,让线程进入等待超时的工作
uiButton=1; // 1,标记这是按钮响应的函数启动的线程
pCANThreads=AfxBeginThread(MyThread1,this); //启动线程
runflag=1; //设置正在发送标识
MyStartThread(); //这里就是模拟用户在启动了上一个线程过后,紧接着再次启动一个线程
}
void CExample2Dlg::MyStartThread() //另外一个开启线程的函数
{
if(runflag==1) //如果线程正在运行
{
SetEvent(m_CANEvent); //发出让线程结束
if( WAIT_OBJECT_0 == WaitForSingleObject(pCANThreads->m_hThread,INFINITE) ) //让其等待建立的线程退出过后才返回
{
}
} //等到之前的线程返回了 ,才可以执行下面代码,再次新开线程
ResetEvent(m_CANEvent); //设置无信号,让线程进入等待超时的工作
uiButton =2; //标记这是自定义函数启动的线程
runflag=1; //设置正在发送标识
pCANThreads=AfxBeginThread(MyThread1,this);
}
UINT CExample2Dlg::MyThread1(void *param)
{
CExample2Dlg *Dlg=(CExample2Dlg *)param;
int i;
CString tmp;
DWORD dw;
//在进入下面循环前,在我那个真实程序前,还有不少Dlg->XXXX的工作,在线程里面操作主界面的一//些显示,读取数据等工作
for(i=0;i<100000;i++) //这里是我人为模拟 要让它循环这么多次,意为模拟发送这么多次
{
dw = WaitForSingleObject(Dlg->m_CANEvent,10); //让其延迟10ms就输出一个数
if( dw == WAIT_OBJECT_0 ) //收到结束线程信号
{
Dlg->runflag=0; //线程运行标志复位
return 0;
}
if( dw == WAIT_TIMEOUT) //延迟到了,就执行下面的显示数值
{
if(Dlg->uiButton == 1)
{
tmp.Format(" %d ",i);
Dlg->m_count.SetWindowText(tmp); //这个是让其在界面上面显示当前i的数值
} // Dlg->m_count是主界面上面的一个static控件
if(Dlg->uiButton ==2 )
{
tmp.Format(" %d ",i);
Dlg->m_count2.SetWindowText(tmp); //这个是让其在界面上面显示当前i的数值
} // Dlg->m_count是主界面上面的一个static控件
}
}
Dlg->runflag=0; //线程运行标志复位
return 0;
}
void CExample2Dlg::OnButton2()
{
// TODO: Add your control notification handler code here
SetEvent(m_CANEvent);
}
[C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
void CExample2Dlg::OnButton1() //这是一个按钮响应函数,用按钮开启线程的函数
{
// TODO: Add your control notification handler code here3
ResetEvent(m_CANEvent); //设置无信号,让线程进入等待超时的工作
uiButton=1; // 1,标记这是按钮响应的函数启动的线程
pCANThreads=AfxBeginThread(MyThread1,this); //启动线程
runflag=1; //设置正在发送标识
Sleep(1000); //加个延时 也许用户等了一点时间再去执行的下面那个函数
MyStartThread(); //这里就是模拟用户在启动了上一个线程过后,紧接着再次启动一个线程
}