您的位置:首页 > 其它

创建一个线程几种方法

2008-08-01 15:13 393 查看
创建线程使用CreateThread
The CreateThread function creates a thread to execute within the address space of the calling process.
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
­
DWORD dwStackSize, 指定初始提交栈的大小
­
LPTHREAD_START_ROUTINE lpStartAddress,
//由线程执行,表示线程的起始地址,指定线程入口函数,
//该入口函数的参数类型以及返回类型要与ThreadProc()函数声明的类型要保持一致
LPVOID lpParameter, //指定一个单独的值传递给线程
DWORD dwCreationFlags, //指定控件线程创建的附加标记
LPDWORD lpThreadId ); //指向一个用来接收线程的标识符变量
参数1:指向SECURITY_ATTRIBUTES结构体的指针。
vc终止线程有三种方法:
1.线程可以在自身内部调用AfxEndThread()来终止自身的运行

2.可以在线程的外部调用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )来强行终止一个线程的运行,
然后调用CloseHandle()函数释放线程所占用的堆栈
TerminateThread会有资源泄漏,不要万不得已,不要用这个函数
DWORD code;
if(GetExitCodeThread(MonitorComm,&code)) //MonitorComm 你创建的线程句柄
if(code==STILL_ACTIVE)
{
TerminateThread(MonitorComm,0);
CloseHandle(MonitorComm);
}
这样就安全了
3.第三种方法是改变全局变量,使线程的执行函数返回,则该线程终止。

下面的例子来演示第三种方法
全局变量m_end来表示是否要结束线程

bool m_end = false;
HWND hWnd;

启动线程:
CWinThread* pThread;

hWnd = GetSafeHwnd();
pThread = AfxBeginThread(ThreadProc,hWnd);
pThread->m_bAutoDelete = false;

线程的函数
UINT ThreadProc(LPVOID pParam);
UINT ThreadProc(LPVOID pParam)
{
while(!m_end)
{
AfxMessageBox("test;");
::Sleep(2000);
}
return 0;
}

终止线程代码
m_end = true;
WaitForSingleObject(pThread->m_hThread,INFINITE); //等待线程结束
delete pThread; //删除线程

-------------------------------------------------------------------------------------------------------------
void CCSocketcliDlg::OnBnClickedConnect()
{
// TODO: 在此添加控件通知处理程序代码
char ipaddress[35];
m_edit2.GetWindowText(ipaddress,30);
cli.sin_addr.s_addr=inet_addr(ipaddress);
cli.sin_family=AF_INET;
cli.sin_port=5000;
clisock=socket(AF_INET,SOCK_STREAM,0);
ee=1;
AfxBeginThread(thread,0);

}
UINT thread(LPVOID v)
{
char buff[100];
char array[25][30]=
{"155.245.160.151",
"155.245.160.152",
"155.245.160.153",
"155.245.160.154",
"155.245.160.155",
"155.245.160.156",
"155.245.160.157",
"155.245.160.158",
"155.245.160.159",
"155.245.160.160",
"155.245.160.161",
"155.245.160.162",
"155.245.160.163",
"155.245.160.164",
"155.245.160.165",
"155.245.160.166",
"155.245.160.167",
"155.245.160.168",
"155.245.160.169",
"155.245.160.170",
"155.245.160.171",
"155.245.160.172",
"155.245.160.173",
"155.245.160.174",
"155.245.160.175"};
CSize size;
size.cx=0;
size.cy=30;
int s=1,addcount=0;
CCSocketcliDlg *dlg=(CCSocketcliDlg*)AfxGetApp()->GetMainWnd();
dlg->m_connect.EnableWindow(false);
dlg->m_disconnect.EnableWindow(true);
while(connect(dlg->clisock,(sockaddr *)&(dlg->cli),sizeof(dlg->cli))&&dlg->ee!=0)
{
dlg->m_edit.SetWindowText(("等候。。。"));
for(int i=0;i<=65000;i++)
for(int j=0;j<=200;j++);
if(addcount==25)
addcount=0;
dlg->cli.sin_addr.s_addr=inet_addr(array[addcount++]);
}
if(dlg->ee==1)
dlg->m_list.InsertItem(dlg->count++,_T("连接成功"));
dlg->m_button1.EnableWindow(TRUE);
dlg->SetForegroundWindow();
while(s!=SOCKET_ERROR&&dlg->ee!=0)
{
s=recv(dlg->clisock,buff,100,0);
dlg->SetForegroundWindow();
if(s!=SOCKET_ERROR&&dlg->ee!=0)
dlg->m_list.InsertItem(dlg->count++,buff);
dlg->m_list.Scroll(size);
}
send(dlg->clisock,"Disconnected",100,0);
dlg->m_button1.EnableWindow(FALSE);
dlg->m_connect.EnableWindow(TRUE);
dlg->m_disconnect.EnableWindow(FALSE);
closesocket(dlg->clisock);
AfxEndThread(0);
return 0;
}

------------------------------------------------------------------------------------------------------------------------------

函数里面:
Parm *parm = new Parm;
parm->s=clifd;
parm->i=i;

hThread=CreateThread(NULL,0,ClientThread,(LPVOID)parm,0,&dwThreadId);
线程函数:
DWORD WINAPI ClientThread(LPVOID parm1)
{
Parm *parm;
parm =(Parm *)parm1;
SOCKET clifd=parm->s;
int i=parm->i;
char pFileName;
cout<<i<<endl;
ofstream f;
f.open("f://1.avi",ios_base::binary);
cout<<"recv..";
int rec=0;
for(int j=0;j<i;j++)
{
memset(&pFileName,0,sizeof(pFileName));
rec= recv(clifd,&pFileName,1,0);
if(rec!= SOCKET_ERROR )
{
if(j%1000==0)
cout<<".";
f.write(&pFileName,rec);
}
else
{
cout<<"error!"<<endl;
break;
}

}
cout<<"end sending!"<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐