怎么找附近的餐馆电话:创建线程的使用

来源:百度文库 编辑:中财网 时间:2024/04/28 11:55:04

2009-11-05 13:02:49|  分类: 默认分类 |  标签: |字号大中小 订阅

创建线程使用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, //指定控件线程创建的附加标记  (CREATE_SUSPENDED: 创建一个挂起的线程 dwCreationFlags :0 表示创建后立即激活)
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<ofstream f;
f.open("f:\\1.avi",ios_base::binary);
cout<<"recv..";
int rec=0;
for(int j=0;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!"<   break;
  }
 
}
cout<<"end sending!"<return 0;
}